【问题标题】:Laravel 5.1 relationship of relationshipLaravel 5.1 关系的关系
【发布时间】:2015-11-13 23:50:09
【问题描述】:

假设我有三个模型:

  • 工人
  • 部门
  • 公司

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

我可以得到所有的部门

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

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

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

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

有没有办法使用关系,以便我可以从Company->hasMany('Worker') 获取关系?

【问题讨论】:

    标签: php laravel eloquent relationship


    【解决方案1】:

    了解 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(未测试):

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

    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;
    

    【讨论】:

    • 这正是我想要的。但是有没有办法通过 2 个中间模型?假设我有一个关系 Worker->hasMany('Worksheet') 并且我正在寻找 Company->worksheets()。
    • 我不确定是否可以在没有原始 SQL 查询的情况下完成连接。或者我们可以获取 hasManyThrough 的来源,并制作我们自己的方法,并将其称为 hasManyThrough2Models。稍等,我会努力做到的。我会尽快反馈。
    • @MihkelAllorg,我已经更新了我的答案,希望对您有所帮助。警告:未测试,但您可以尝试
    【解决方案2】:

    你可以试试:

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

    因此,它将分别返回每个部门下属于该公司的所有工人。在这种情况下,你可以这样循环:

    @foreach($company->departments as $department)
    
        {{ $department->name }}
    
        @foreach($department->workers as $worker)
    
            {{ $worker->name }}
    
        @endforeach;
    
    @endforeach;
    

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 2016-06-03
      相关资源
      最近更新 更多