【发布时间】:2018-08-31 17:39:00
【问题描述】:
在 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 |
+----------+---------+
页面控制器
$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);
}
...
}
谢谢
【问题讨论】:
标签: laravel pivot-table primary-key