Php Laravel 5.1关系的关系
假设我有三个模型:Php Laravel 5.1关系的关系,php,laravel,eloquent,relationship,Php,Laravel,Eloquent,Relationship,假设我有三个模型: 工人 系 公司 一个公司有许多部门,一个部门有许多工人。现在我怎样才能从公司里招到所有的工人 我可以把所有的部门都搞定 Company::find(1)->departments() 我可以让所有的工人 Department::find(1)->workers() 我尝试为模型公司创建一种方法,如下所示: public function workers() { return $this->departments->map(functio
- 工人
- 系
- 公司
Company::find(1)->departments()
我可以让所有的工人
Department::find(1)->workers()
我尝试为模型公司创建一种方法,如下所示:
public function workers()
{
return $this->departments->map(function($item, $key){
return $item->workers;
});
}
当我想用三个参数对集合调用方法'where()'
时,问题出现了,它给了我一个空集合
Company::find(1)->workers()->where('salary', '>=', '100');
无论我做什么,它都会返回一个空集合。我试了一下,把“100”作为整数传递。以下工作很好:
Company::find(1)->workers()->where('salary', '100');
给我所有的工人,他们的薪水是100英镑
是否有一种使用关系的方法,以便我可以从公司->hasMany('Worker')
获取关系?您可以尝试:
$company = Company::with('departments.workers')->find(1);
因此,它将返回每个部门下属于该公司的所有员工。在这种情况下,您可以这样循环:
@foreach($company->departments as $department)
{{ $department->name }}
@foreach($department->workers as $worker)
{{ $worker->name }}
@endforeach;
@endforeach;
阅读hasManyThrough()。将功能添加到公司模型中:
public function workers()
{
// hasMany Workers through Department
return $this->hasManyThrough('App\Models\Worker', 'App\Models\Department');
}
因此,现在您可以执行以下操作:
$Company = Company::with('workers')->find(1);
$Workers = $Company->workers;
一点奖金。要通过两个模型获取数据,请使用hasManyThrough+hasMany(未测试)之类的方法: 创建类(模型目录中的文件): app/Models/ExtendedModel.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class ExtendedModel extends Model {
public function hasManyThrough2Models($model1, $model2, $model3, $model1Key, $model2KeyWith1, $model2Key, $model3KeyWith2)
{
$model1 = new $model1;
$model1Table = $model1->getTable();
$model2 = new $model2;
$model2Table = $model2->getTable();
$model3 = new $model3;
$model3Table = $model3->getTable();
return $model1
->join($model2Table, $model2Table . '.' . $model2KeyWith1, '=', $model1Table . '.' . $model1Key)
->join($model3Table, $model3Table . '.' . $model3KeyWith2, '=', $model2Table . '.' . $model2Key)
->select($model1Table . '.*');
}
}
这正是我想要的。但是有没有办法通过两个中间模型?假设我有一个关系工作者->hasMany('工作表'),我正在寻找Company->worksheets()。我不确定这是否可以在没有原始SQL查询和连接的情况下完成。或者我们可以获得hasManyThrough的源代码,并创建我们自己的方法,并将其称为hasManyThrough2Models。等一下,我会尽力去的。我很快就会反馈。@Mihkellallorg,我已经更新了我的答案,希望能有所帮助。警告:未测试,但您可以尝试
<?php namespace App\Models;
class Company extends ExtendedModel {
public function worksheets() {
return $this->hasManyThrough2Models('App\Models\Worksheet', 'App\Models\Worker', 'App\Models\Department', 'worker_id', 'id', 'department_id', 'id');
}
$Company = Company::with('worksheets')->find(1);
$Worksheets = $Company->worksheets;