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;