【问题标题】:L5.5 relationship of pivot table with another modelL5.5 数据透视表与另一个模型的关系
【发布时间】:2018-06-28 09:44:49
【问题描述】:

在我的应用程序中,模型Device 与模型Task 具有多对多关系。 设备和任务的组合可以分配给不同数量的模型User。 示例:Device A 有一个任务 Check something,这应该由 User Frank 和 Steven 完成。

在我看来,这应该是一个“标准问题”,但到目前为止我还没有找到合适的解决方案。

现在,我使用以下解决方法: a) 将唯一 ID id 添加到 device_task 数据透视表 b) 从数据透视表查询id c) 创建一个新表device_task_user,其中包含user_iddevice_task_id b) 使用查询生成器获取/添加用户

但我真的对这种方法不满意。

是否有可能,数据透视表也扩展了模型,然后与User 建立一对多关系? 或者您会建议向数据透视表添加一个 json 列并将用户存储在那里?

欢迎任何想法!

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    是否有可能,数据透视表也扩展了模型

    是的,这是可能的。来自the docs

    如果您想定义一个自定义模型来表示您的关系的中间表,您可以在定义关系时调用 using 方法。所有用于表示中间关系表的自定义模型都必须扩展 Illuminate\Database\Eloquent\Relations\Pivot

    您还可以在 TaskDevice 模型之间创建新的 hasMany()belongsTo() 关系,并使用它们以及现有的 belongsToMany 关系。您需要在数据透视模型和User 模型之间定义新关系,以便能够按设备、任务或用户获取数据。

    【讨论】:

    • 谢谢!我理解你答案的第一部分(你指的是文档),但你答案的第二部分让我感到困惑:我不清楚这如何解决我的问题
    • @titonior 在第二部分我想告诉你,你可以创建额外的关系来轻松获取数据。
    • 对不起,我可能还是不明白。您的意思是:a) 为数据透视表创建一个新模型 DeviceTask b) 定义 Device 和 DeviceTask 之间的一对多关系 c) 定义 Task 和 DeviceTask 之间的一对多关系 d) 最后定义一个DeviceTask 和 User 的一对多关系??
    • @titonior 是的,你还可以同时使用多对多关系,这样更方便。
    • Alexey,我完全按照您对我的建议进行了操作,并且运行良好。 - 再次非常感谢!
    【解决方案2】:

    修改多对多关系以保存额外字段user_id

    class Device extends Model
    {
    
      public function tasks()
      {
        return $this->belongsToMany(
            Task::class,
            'device_task',
            'device_id',
            'task_id'
        )->withPivot('user_id');
      }
    
    }
    

    当更新时在控制器中这样做

    $device->tasks()->attach([$taskId]=>['user_id']=>$userId);
    

    当然你需要DeviceTask 模型以及User 模型和DeviceTask 模型之间的has-many 关系来获取用户的任务

    【讨论】:

    • 谢谢!我知道这是可能的,但由于设备/任务可能有多个用户,因此需要一个 json 列,对吗?这是否是最佳实践方法?
    • 在这种情况下,最好在userDeviceTask 之间建立多对多关系
    • 在这种情况下,您需要手动按数据透视表过滤数据,而不是使用关系。
    猜你喜欢
    • 2021-09-05
    • 2019-01-25
    • 1970-01-01
    • 2013-06-26
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2021-01-19
    相关资源
    最近更新 更多