【问题标题】:Fetch a Model's associations in Laravel to simplify creation/update在 Laravel 中获取模型的关联以简化创建/更新
【发布时间】:2015-07-26 05:19:39
【问题描述】:

我有一个具有以下关联 (belongsToMany) 的电影模型:
演员
国家
类型 ...

发布表单时,我有这些数据(这里跳过很多细节):
'演员' => 数组(
“加里·格兰特”,
“格蕾丝·凯利”,
...
),
'流派' => 数组(
'戏剧',
...
),
...

我希望我的 update()/store() 控制器函数能够轻松关联这些模型。

名为“Cary Grant”的演员可能存在也可能不存在,并且可能已经或可能不与我正在编辑的电影相关联。我也可以将他从这部电影中删除,所以我需要删除关联。与类型和其他所有内容相同。

所以我想我会做一个 BaseModel 并在那里只做一次所有这些,就像这样:
1. 获取电影模型定义的关联。
2. 检查 POST 数据是否包含这些关联。
3. 对于它们中的每一个,检查它们是否存在(如果不创建它们)并返回一个 id 数组。我正在检查的列是“名称”,但它可以是可配置的。
4. sync() 那些 id。

目前,我不需要从电影表单中向相关模型添加更多内容(例如演员的生日)。

我被困在 n.1($movie->getRelations() 仅适用于现有电影),总的来说,我不确定这是否是正确的方法。提示?

【问题讨论】:

    标签: php laravel orm sync


    【解决方案1】:

    使用直接关系:$model->actors

    http://laravel.com/docs/4.2/eloquent#relationships

    所有 sync() 的东西都将由 ORM 完成,所以你应该做的最复杂的事情是 n.3。您必须在 $model->actors 和 $_POST['actors'] 之间创建差异,并了解您需要插入哪些演员(创建新演员)。

    【讨论】:

    • 是的,我的主要问题是动态获取模型的关系,而不是一一编写
    【解决方案2】:

    我遇到了同样的问题,这就是我在项目中所做的:

    1. 我没有检索模型的所有已定义关系,而是将可以通过添加静态成员更新的关系列入白名单

      Movie::$editableRelations = ['actors', 'genres', 'countries'];

    2. 遍历发布数据,并匹配$editableRelations 数组。如果一个关系的数据存在,按照下面的步骤,否则我们根本不去接触这个关系。

    第 3 步和第 4 步与您的相同。

    【讨论】:

    • 知道了,所以我走在正确的道路上,我需要在静态属性中硬编码我的关系。如何在没有模型名称的情况下循环发布数据以查找现有关系并创建新的关联实体?我不能简单地删除最后的 's' 并更改第一个字母的大小写,它不适用于国家(国家 - >国家)
    • 您可以发布您的 POST 数据的示例数据吗?
    • 示例在我的原始帖子中,名称数组的数组
    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多