【问题标题】:how to define many to many relationship in laravel models?如何在 laravel 模型中定义多对多关系?
【发布时间】:2016-12-10 05:50:32
【问题描述】:

我有两个主表。即userstasks。用户表的主键列名称为in_user_id,任务表的主键列名称为in_task_id

有关系表users_tasks(查看一个任务分配给了哪些用户以及一个用户分配了哪些任务)。 users_tasks 表中的外键列是in_task_idin_worker_id

我想在两个模型中定义用户和任务的关系(多对多)。我读过这个doc。但就我而言,主键列是用户表中的 in_user_id 。但是 users_tasks 表中的外键列名称是 in_worker_id

所以我不知道如何处理关系函数中的第四个参数(return $this->belongsToMany('App\User', 'users_tasks', 'in_task_id', ?); 在任务模型中文件)。 in_user_idin_worker_id 或需要定义更多的东西。如果有人知道解决方案,将不胜感激。

【问题讨论】:

  • 试试这个 $this->belongsToMany('App\User, 'users_tasks', 'in_worker_id ', 'in_user_id '); params -> 模型、关系表、外键、主键

标签: php laravel laravel-5.2


【解决方案1】:

来自laravel eloquent documentation on many-to-many relationships

除了自定义连接表的名称外,您还可以通过将附加参数传递给 belongsToMany 方法来自定义表上键的列名。第三个参数是要定义关系的模型的外键名称,而第四个参数是要加入的模型的外键名称:

在你的情况下是:

return $this->belongsToMany('App\User', 'users_tasks', 'in_task_id', 'in_worker_id');

现在假设一些事情:

  1. 您的用户和任务模型工作正常(因为您在模型中定义了非常规标识符)。
  2. 不确定是否仍然如此,但在以前版本的 Laravel 中,您的数据透视表(在本例中为 users_tasks)还需要它自己的标识符列,通常是自动递增的 id。

【讨论】:

    【解决方案2】:

    试试这个

    $this->belongsToMany('App\User, 'users_tasks', 'in_worker_id', 'in_user_id');

    params -> 模型、关系表、外键、主键

    而且关系表也应该按字母顺序排列。 (最好的办法) 必须是 tasks_users

    【讨论】:

    • “必须”和“最好”是(至少)主观的。
    • @NandaKumar 我知道关系表名称应该按字母顺序排列。但我无法更改任何表或列的名称。
    • @Akshay Vaghasiya 但我没有任何选项可以更改任何表或列的名称 - 不清楚
    • 好吧,让我这么说吧,按字母顺序排列并不是“最好的方式”,而是一种方式。这样做在性能和可读性上都没有优势,所以这只是一个约定。你要么选择坚持下去(laravel 作者建议你这样做),要么不坚持下去,这取决于你和其他从事该项目的人。
    • 请查看已编辑的问题。我已经提到在哪个文件中,我正在定义关系。即Task Model 文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多