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;
假设我有三个模型:
- 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;