我有3张桌子
型
type_id
人
person_id
类别
category_id
table_name
table_id
person_id
在类别中,我有不同的表/模型与Type模型的连接,所以如果我想让type_id与person_id = 23的人连接,那么查询应该如下所示:
SELECT * FROM category WHERE table_name='person' AND table_id = 23
在我的 Person 模型中,我用这种方式定义了与Type的关系:
public function groups()
{
return $this->belongsToMany('Type', 'category',
'table_id', 'type_id')->wherePivot( 'table_name', '=', 'person' );
}
当我想要获得这些类型时,我会使用:
$person->groups()->get()
查询如下所示:
select `type`.*, `category`.`table_id` as `pivot_table_id`, `category`.`type_id` as `pivot_type_id` from `type` inner join `category` on `type`.`type_id` = `category`.`type_id` where `category`.`table_id` = '23' and `category`.`table_name` = 'person';
所以它似乎是正确的。
但是我想使用sync()
来与人员同步类型,这就是问题所在。
当我使用时:
$person->groups()->sync('1' => ['table_name' => 'person']);
我看到获取sync
类别所有记录的查询如下所示:
select `type_id` from `category` where `table_id` = '23';
所以它没有使用
`category`.`table_name` = 'person'
条件因此同步不会按预期工作。
有没有简单的方法可以解决它,还是应该手动同步?
答案 0 :(得分:0)
您应该使用Eloquents多态关系(http://laravel.com/docs/4.2/eloquent#relationships)
class Category extends Eloquent {
public function categorizable()
{
return $this->morphTo();
}
}
class Person extends Eloquent {
public function categories()
{
return $this->morphMany('Category', 'categorizable');
}
}
现在我们可以从人身上检索祸害:
$person = Person::find(1);
foreach ($person->categories as $category)
{
//
}
并从类别访问个人或其他所有者:
$category = Category::find(1);
$categorizable_model = $category->categorizable; //e.g. Person
答案 1 :(得分:0)
我可以确认这是我使用的Laravel 5提交中的一个错误。我已经升级了Laravel 5最终版本,现在可以生成查询。