【问题标题】:Eloquent relationship between array items and other tables数组项与其他表之间的雄辩关系
【发布时间】:2016-06-24 02:17:00
【问题描述】:

我无法理解我需要什么才能使这种关系发挥作用。

我有一个包含 3 个字段的产品更新表单。 更新 ID描述受影响的区域

受影响的区域是我们大楼中每个工作区域的一组复选框。当它提交时,选定的区域将作为数组存储在我的表中。我需要在这些区域和其中的所有人之间建立关系,以便在显示产品更新列表时,我还可以列出受此更新影响的所有人员。

此时我有 3 张桌子。

  1. update_info - id、描述、受影响区域
  2. update_people - id、name、area_id
  3. update_areas - id,区域

我不明白如何使 受影响区域的数组 与 update_areas 相关,然后每个区域与具有该区域 ID 的人员相关。我的方法有问题吗?

`公共函数创建(请求$request)

{


    $update = new Update;

    $update->id = $request->number;

    $update->description = $request->description;

    $update->areas()->sync($request->input('area'));

    $update->save();

    return view('updates.index');

}`

这样做会出现致命错误。

致命错误:在 null 上调用成员函数 sync()

【问题讨论】:

    标签: php laravel eloquent laravel-5.2


    【解决方案1】:

    您不能那样做,您需要一个可能称为update_info_areas 之类的数据透视表,但这是您的选择。这个数据透视表只是帮助扩展表中的这些数组,以便数据库可以使用它们来连接其他表。如果您的 ID 为 1 的 update_info 有 10 个区域,那么在您的数据透视表中,这将是 10 条记录,其中 update_info_id 是每条记录 1 条,area_id 将是每个 areaid 与该相关update_info.

    此表将有一个update_info_id 列与您的update_info.id 列相关,还有一个area_id 列与您的update_areas.id 列相关。

    这将使您在update_infoupdate_areas 之间建立belongsToMany 关系。

    要使用它来添加记录,它会很简单。

    例如,假设您尝试将 ID 为 1、3、4、5 和 6 的区域设置为 ID 为 1 的 update_info

    $updateInfo = UpdateInfo::find(1);
    $updateInfo->areas()->sync([1,3,4,5,6]);
    

    这将首先删除与该更新信息关联的所有区域并重新添加选定区域。

    如果您只想附加或分离某个区域,而不删除该区域已经存在的所有内容......这将同样简单。假设您现在要从 update_info 中删除区域 1 和 3,但还要附加区域 2。

    $updateInfo = UpdateInfo::find(1);
    $updateInfo->areas()->detach([1,3]);
    $updateInfo->areas()->attach([2]);
    

    【讨论】:

    • 所以当提交表单时,我是否会循环遍历控制器中的区域数组,为 update_info_areas 中的每个区域创建一个新条目?有没有更好的方法来处理从表单传递给控制器​​的数组?
    • 这是一般的想法,但是 Laravel 在使用 belongsToMany 时提供了一些方法,这样做会更容易。我会更新答案。
    • 好吧,我想我已经弄清楚了关系,但是当表单将数组传递给我的控制器时,数据看起来像:"area" => array:4 [▼ 0 => "CPT" 1 => "ENGINEERING TECH" 2 => "LAYOUT" 3 => "PRODUCTION MANAGER" ] 我是否需要查询我的更新区域表才能获得其中每个的 id 然后使用同步功能?
    • 那行得通。但是,当我构建表单时,我将复选框的值设置为在数据库中找到的 id,这样我以后就不必重新查询它们了。
    • public function create(Request $request) { $update = new Update; $update->id = $request->number; $update->description = $request->description; $update->areas()->sync($request->input('area')); $update->save(); return view('updates.index'); } 这样做我得到一个致命错误。 致命错误:在 null 上调用成员函数 sync()
    猜你喜欢
    • 2019-11-06
    • 2018-07-24
    • 2019-07-01
    • 2021-03-15
    • 1970-01-01
    • 2019-10-18
    • 2017-04-14
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多