Laravel 5.1 关系的关系

Laravel 5.1 relationship of relationship

假设我有三个模型:

  • Worker
  • Department
  • Company

一个公司有很多部门,一个部门有很多工人。现在我怎样才能得到公司的所有工人?

我可以得到所有部门

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');

而且 returns 无论我做什么都是一个空集合。我尝试了 whereLoose,将“100”作为整数传递。以下工作正常:

Company::find(1)->workers()->where('salary', '100');

给我所有工资为 100 的工人。

有没有一种方法可以使用关系以便我可以从 Company->hasMany('Worker') 获得关系?

你可以试试:

$company = Company::with('departments.workers')->find(1);

所以,它会 return 每个部门下属于该公司的所有工人。在这种情况下,你可以像这样循环:

@foreach($company->departments as $department)

    {{ $department->name }}

    @foreach($department->workers as $worker)

        {{ $worker->name }}

    @endforeach;

@endforeach;

了解 hasManyThrough (http://laravel.com/docs/5.1/eloquent-relationships#has-many-through)。向您的公司模型添加功能:

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;



一点奖金。通过 2 个模型获取数据,例如 hasManyThrough+hasMany(未测试):

创建class(模型目录中的文件):

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 . '.*');
    }
}

然后通过2个模型获取数据:

<?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;