具有非主键的Laravel数据透视表

时间:2018-03-22 10:18:03

标签: laravel pivot-table primary-key

在Laravel中,我有一个拥有自定义主键的模型。我创建了一个数据透视表,必须使用唯一的递增键,因此我无法获得任何数据透视数据。

媒体模型

class Media
{
    protected $primaryKey = 'ref_id';
    public $incrementing = false;

    ...
}

页面模型

class Page
{
    public function media()
    {
        return $this->belongsToMany('App\Models\Media');
    }

    ...
}

数据透视表

+----------+---------+
| media_id | page_id |
+----------+---------+
|     1    |    15   |
+----------+---------+
|     5    |    27   |
+----------+---------+

的PageController

$pages = Page::with('media')->get();  

这导致以下sql语句:

select 
    media.*, media_page.page_id as pivot_page_id, 
    media_page.media_id as pivot_media_id 
from media inner join media_page on media.ref_id = media_page.media_id
where media_page.page_id in ('15', '27')

正如您在sql语句的第4行所看到的,它引用的是media.ref_id而不是media.id,因此显然没有返回任何结果。我明白为什么会这样。我需要知道的是如何更新我的PageController中的媒体方法,以便它为这一个查询使用id而不是ref_id。我无法更改媒体模型中的主键,因为这在其他地方被大量使用。我尝试过以下但似乎没有效果。

页面模型

class Page
{
    public function media()
    {
        $media = new Media();
        $media->setPrimaryKey('id');

        return $this->belongsToMany($media);
    }

    ...
}

由于

2 个答案:

答案 0 :(得分:0)

Laravel Documentation您可以传递表名以及您想要使用的外键。

  

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

     

return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');

答案 1 :(得分:0)

如果您查看https://laravel.com/docs/5.6/eloquent-relationships处的文档,您会看到belongsToMany()也接受其他参数来设置如何加入表格return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');