7

刚刚迁移到 4.1 以利用这个强大的功能。检索单个“morphedByXxxx”关系时,一切似乎都正常工作,但是当尝试检索特定标签所属的所有模型时——我得到一个错误或没有结果。

$tag = Tag::find(45); //Tag model name = 'awesome'

//returns an Illuminate\Database\Eloquent\Collection of zero length
$tag->taggable; 

//returns Illuminate\Database\Eloquent\Relations\MorphToMany Builder class
$tag->taggable();

//returns a populated Collection of Video models
$tag->videos()->get();

//returns a populated Collection of Post models
$tag->posts()->get();

我的标签模型类看起来像这样:

class Tag extends Eloquent
{
    protected $table = 'tags';
    public $timestamps = true;

    public function taggable()
    {
        //none of these seem to function as expected,
        //both return an instance of MorphToMany

        //return $this->morphedByMany('Tag', 'taggable');
        return $this->morphToMany('Tag', 'taggable');

        //this throws an error about missing argument 1
        //return $this->morphToMany();
    }

    public function posts()
    { 
        return $this->morphedByMany('Post', 'taggable');
    }


    public function videos()
    { 
        return $this->morphedByMany('Video', 'taggable');
    }

}

Post 和 Video 模型如下所示:

class Post extends Eloquent
{
    protected $table = 'posts';
    public $timestamps = true;

    public function tags()
    {
        return $this->morphToMany('Tag', 'taggable');
    }

}

我可以向帖子和视频添加/删除标签,以及检索任何标签的相关帖子和视频——但是——检索所有标签名称为“真棒”的模型的正确方法是什么

4

2 回答 2

6

能够弄清楚,很想听听对此实施的评论。

在 Tag.php 中

public function taggable()
{
    return $this->morphToMany('Tag', 'taggable', 'taggables', 'tag_id')->orWhereRaw('taggables.taggable_type IS NOT NULL');
}

在调用代码中:

$allItemsHavingThisTag = $tag->taggable()
                ->with('videos')
                ->with('posts')
                ->get();
于 2013-09-09T13:58:12.430 回答
0

我刚刚在 Laravel 5.2 上使用了这个(虽然不确定这是否是一个好策略):

标签型号:

public function related()
{
    return $this->hasMany(Taggable::class, 'tag_id');
}

可标记型号:

public function model()
{
    return $this->belongsTo( $this->taggable_type, 'taggable_id');
}

要检索所有反向关系(附加到请求标签的所有实体):

@foreach ($tag->related as $related)
    {{ $related->model }}
@endforeach

...可悲的是,这种技术不提供急切的加载功能,感觉就像一个 hack。至少它可以很容易地检查相关的模型类并显示所需的模型属性,而不必担心在正确的模型上寻找正确的属性。

我在另一个线程中发布了一个类似的问题,因为我正在寻找事先不知道的关系。

于 2016-09-30T19:44:33.217 回答