Laravel - 与额外列同步

时间:2015-01-31 12:07:05

标签: php laravel laravel-4 eloquent laravel-5

我有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'

条件因此同步不会按预期工作。

有没有简单的方法可以解决它,还是应该手动同步?

2 个答案:

答案 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最终版本,现在可以生成查询。