Laravel - Eloquent - 与命名空间

时间:2015-05-04 18:50:05

标签: laravel polymorphism eloquent laravel-5

我有2个与polimorphic关系相关的表:

商店表:

id  |  name     |   ... 
15  |  my_store |   ...

Tag表,通过related_id键和类型连接到Store表。

id  |  related_id  |  tag   |  created  |  type  
1   |  15          |  test  |  00:00:00 |  store
2   |  15          |  dummy |  00:00:00 |  product

所以,在那个例子中,Store" my_store"只有标签" test" (" dummy"是产品的标签,而不是商店,除了它具有相同的related_id)。

我在我的代码中定义了Store模型,如下所示:

class Store extends Model {

protected $table = 'store';

public function tags()
{
    return $this->morphMany('App\Tag', 'related', 'type');
}
}

标签模型:

class Tag extends Model {

protected $table = 'tags';

public function related()
{
    return $this->morphTo();
}
}

但是当我尝试运行时

$store->tags;

我看到Laravel试图运行的查询是:

SQL: select * from `mwp_tags` where `mwp_tags`.`related_id` = 46 
and `mwp_tags`.`related_id` is not null 
and `mwp_tags`.`type` = App\Store)

查询正在寻找 App \ Store 而不是商店

我无法更改数据库中的值,我不想使用

    protected $morphClass = 'store';

在商店模型中,因为我不知道是否需要创建另一个morphMany关系,可能还有另一个类型名称。

有人知道如何跳过此问题?谢谢!

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

public function tags()
{
    $default_morph_class = $this->morphClass ?: null;
    $this->morphClass = 'store';
    $morph_many_query = $this->morphMany('App\Tag', 'related', 'type');
    $this->morphClass = $default_morph_class;
    return $morph_many_query;
}

您可以动态更改morphClass并将其设置回来。这允许您为不同的关系使用不同的morphClass。