Laravel 5.2 Eloquent 主键作为多键

Posted

技术标签:

【中文标题】Laravel 5.2 Eloquent 主键作为多键【英文标题】:Laravel 5.2 Eloquent primary key as a multiple key 【发布时间】:2017-02-03 13:31:56 【问题描述】:

我有一个包含以下列的模型:

blog_id (fillabale) 日期(可填写) 计数器

blog_id + 日期的唯一键

每当我试图从这个表中获取结果时,例如,

$model = BlogCounter::findOrNew(2,'2016-09-25');

或者

$model = BlogCounter::whereBlogId(2)->whereDate('date','=','2016-09-25')->first()

我收到错误:

列 blog_counter.id 不存在

我试图覆盖 primaryKey 并将其设置为 null / ['blog_id', 'date'] / 'blog_id,date' 以上都没有解决 Eloquent 试图通过 id 获取 raw 的问题..

我在这张表上没有主键,因为我使用的是唯一键。

我错过了什么吗?如何强制 Eloquent 模型在没有主键的情况下工作?

BTY,我现在使用的是 PostgreSQL 9.5。

谢谢!

【问题讨论】:

你不能,因为 laravel 只对 eloquent 模型的关键属性提供 find 方法。所以你必须制作一个主键字段。看到这个github.com/laravel/framework/issues/5355 您发布的错误是由使用 findOrNew 的第一个查询返回的,您在使用 wheres/first 的第二个查询时遇到什么错误? 【参考方案1】:

Eloquent 假定您的表中有一个 id 列来标识一行。在您的情况下,此列名为 blog_id,因此您需要让 Eloquent 知道。

您可以通过在模型中定义 primaryKey 属性来做到这一点。它不需要是数据库中的主键,只要它可以用于获取单个记录即可:

class BlogCounter extends Model 
  protected $primaryKey = 'blog_id';

【讨论】:

@edrzej.kurylo 我的“关键”是 2 个字段(唯一)日期 + blog_id 的组合。这就是我正在努力解决的问题。 Eloquent 不支持复合键,所以不能使用 find*() 方法来获取记录。您需要将自己的逻辑添加到模型中

以上是关于Laravel 5.2 Eloquent 主键作为多键的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent Model :: find不起作用

在 Eloquent 查询/Laravel 5.2 中使用变量

Laravel 5.2 pluck() 来自 Eloquent 模型集合的多个属性

Laravel 5.2,Eloquent,将表 1 连接到表 2 并带上表 2 的 MAX 列

雄辩的模型属性作为骆驼案例 [Laravel 5.2] [Dingo API]

Laravel 5.2 Eloquent ORM 从 3 个表中获取数据