在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);
}
...
}
由于
答案 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');