【发布时间】:2018-08-06 12:53:26
【问题描述】:
我有一个项目,该项目可以有附件。项目和文档都是模型/表格。
简化示例文档表:
-----------------------------------
| ID | filename | version |
-----------------------------------
| 1 | list.docx | 1 |
| 2 | list.docx | 2 |
| 3 | file.xls | 1 |
-----------------------------------
我想要一些简单的版本控制,这样如果用户想要他们可以“替换”文档,新的表格行复制除 ID 和版本之外的所有先前条目值。
我的问题是我想使用关系来提取所有最新文档。我目前在项目模型中使用这个怪物:
public function latest_documents()
{
return $this->hasMany(Document::class)
->where('version', \DB::raw('(SELECT max(d.version) from documents d where d.filename = documents.filename)'))
}
一定有更好的方法吗?我尝试只使用 groupBy() 和 max() 的关系,但得到了错误。
编辑:在 DB::raw 解决方案之前尝试了“Laravel 方法”:
public function documents()
{
return $this->hasMany(Document::class)->groupBy('filename')->max('version');
}
错误:
Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation
【问题讨论】:
-
请使用您尝试过的
groupBy()发布查询。 -
@JonasStaudenmeir 完成了,并不是说我认为它有很大帮助!似乎无法弄清楚如何对行进行分组,然后选择具有最高/最大版本的行
-
你试过
$query->orderBy('version', 'desc')->groupBy('filename'); -
@rkj 解决这个错误:
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'app.documents.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by -
你能在
config/database.php中添加'strict' => false吗?然后尝试
标签: mysql laravel eloquent laravel-5.4