【问题标题】:Retrieving all morphedByMany relations in Laravel Eloquent在 Laravel Eloquent 中检索所有 morphedByMany 关系
【发布时间】:2016-03-11 19:13:02
【问题描述】:

在 Laravel 文档中,有以下示例用于检索 morphedByMany 关系,这是多对多的多态关系。

Laravel Many to Many polymorphic relations documentation

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    /**
     * Get all of the posts that are assigned this tag.
    */
    public function posts()
    {
        return $this->morphedByMany('App\Post', 'taggable');
    }

    /**
     * Get all of the videos that are assigned this tag.
     */
    public function videos()
    {
        return $this->morphedByMany('App\Video', 'taggable');
    }
}

如何在一个查询/集合中获得所有morphed 关系的列表,例如postsvideos,然后如果我后来添加photos(或其他任何东西),那也是?

【问题讨论】:

  • 找到解决方案了吗?
  • 我做了,但我没有代码,这是一份旧工作……我所做的基本上是使用查询生成器来获取结果并使用自定义集合中的数据构建模型类。

标签: php laravel eloquent polymorphism


【解决方案1】:

我在这里使用了一个技巧:

为您的连接表taggable 创建一个模型Taggable,并将hasMany 关系添加到Tag 模型。

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

在您的 Taggable 模型中创建 morphedTo 关系。

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

现在你可以通过调用获取所有使用该标签的模型:

$tagged = Tag::with('related.taggables');

【讨论】:

  • 我相信这是现在解决这个问题的最佳方法。
  • 我已经为整个设置创建了一个gist + 如何获取相关项目
【解决方案2】:

您是否想过使用集合的“联合”功能来合并所有不同的集合以检索您需要的所有内容?

class Tag extends Model
{
    [...]

    /**
     * Get all of.
     */
    public function morphed()
    {
        return $this->video->union($this->posts)->all();
    }
}

【讨论】:

  • 这不适用于我稍后添加更多变形元素的情况,但对于获取视频和帖子的特定情况,它会起作用。
  • 当你添加新的变形对象时,你可以在这个函数中添加一个->联合。当然不是全自动的,但无论如何你必须将一些代码行更改为你的模型......
  • 这不起作用。例如:我有一个 Page 模型,并且不同的模型都与此相关联,例如 Content 和 Parallax。我有一些相关的记录:
     page |类型 |编号 1 |内容 | 1 1 |视差 | 2 1 |内容 | 3 1 |内容 | 4 
    * 如果我做$this->content->union($this->parallax)->all(); 返回三个记录:1、3、4 * 如果我做$this->parallax->union($this->content)->all(); 返回三个记录:2、3、4
【解决方案3】:

你应该可以在你的 Tag 类上添加一个这样的关系

public function taggable()
{
    return $this->morphedTo();
}

这将使用 taggable_id 和 taggable_type 来获取它所绑定的相关模型。

【讨论】:

  • 那是多态关系,我特指morphedByMany关系,它是多对多的多态关系。我将更新问题以使其更清楚。
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 2014-02-01
  • 2019-12-11
  • 2022-07-27
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2019-08-17
相关资源
最近更新 更多