在 Laravel 中使用 Eloquent 多态关系对数据进行分类

Posted

技术标签:

【中文标题】在 Laravel 中使用 Eloquent 多态关系对数据进行分类【英文标题】:Using Eloquent polymorphic relationships to categorise data in Laravel 【发布时间】:2016-01-30 10:26:43 【问题描述】:

在我的应用程序中,我有一个类别表和多个表,包括需要分类的服务和文章。为方便起见,我想对这些数据使用多态模型。

创建一个类别供服务或文章使用。例如,一旦将表定义为服务表,它就不会显示为可能的类别来添加文章。

这也适用于列表。我将有一个文章菜单和一个服务菜单,其中每一个都将仅列出文章或服务类别,无论它们是空的还是包含它们各自的类型。

例如,一个服务类别可用于许多服务。同样,一个服务可以有很多类别,但只有服务类别。

就目前而言,我的数据库可能不足。我没有使用数据透视表,但是当我尝试使用数据透视表时,它不允许我只选择文章类别或服务类别;事实上,两者之间根本没有区别。

基本上,我需要能够:

获取服务可用的所有类别的列表(可能是where('categorizable_type', 'App\Service')?) 获取文章可用的所有类别的列表(可能是where('categorizable_type', 'App\Article')?) 获取一个类别中所有文章/服务的列表 获取文章/服务使用的所有类别的列表

在这种理想情况下,我也可以轻松地将新的(或现有的)文章/服务添加到类别中:

$category = App\Category::find(1);
$article = new App\Article();
$article->title = 'This is an article title.';
$category->articles()->save($article);

我可以轻松地将新的(或现有的)类别添加到文章/服务中:

$article = App\Article::find(1);
$category = new App\Category();
$category->title = 'This is a category title.';
$article->categories()->save($category);

【问题讨论】:

什么“不起作用”?你有错误吗?您是否获得一组数据,但期待另一组数据?让我们知道您的期望、得到的结果以及任何错误。 @patricus 我已经编辑了我的帖子,但现在,没有太多错误,因为缺少正确选择数据所需的接口。我不确定如何实现这一点,但我确信这个概念是在 Eloquent 中管理这些数据的适当方式。 我再次更新了这个,希望让它更有意义。一般问题是关于概念和技术的,因此很难解释错误。 【参考方案1】:

嗯,您的数据库和模型定义以及用于向文章添加类别的代码看起来都不错。但是,您将文章添加到类别的代码有一点偏差。

首先,没有$category->articles() 方法。要访问相关对象,请使用您定义的关系:$category->categorizable()。此外,关系属性$category->categorizable 将包含加载的相关对象,它会自动成为ArticleService 对象,具体取决于相关内容。

其次,这是关系的morphTo() 方面;它的行为类似于belongsTo(),并且具有类似的方法。例如,没有save() 方法,但您有associate() 方法。这意味着您必须先创建文章,然后将其与类别相关联。另外,associate() 不会自动保存,所以你也需要调用它。

$article = new App\Article();
$article->title = 'This is an article title.';
$article->save();

$category = App\Category::find(1);
$category->categorizable()->associate($article);
$category->save();

// showing use of relationship attribute
$related = $category->categorizable;
echo get_class($related);

【讨论】:

有道理,我试试看。我只是用我想要工作的代码快速更新我的帖子,看起来有可能吗?如果没有,您的解决方案应该可以工作!

以上是关于在 Laravel 中使用 Eloquent 多态关系对数据进行分类的主要内容,如果未能解决你的问题,请参考以下文章

如何用 Eloquent 建立多态关系

laravel 使用 in 子句模型名称连接多态数据透视表

检索多态关系 laravel 的所有者

Laravel 5中的反向多态关系

我需要知道用于查询嵌套关系并返回结果的 Laravel Eloquent 语法

Laravel/Eloquent - 创建与可能具有或不具有属性的父模型相关的多个子模型的关系