我有一个items
表,该表有一个sequence
列,其值应该是子查询的结果:
INSERT INTO items (company_id, sequence, name)
VALUES (1, (
SELECT
COALESCE(max(i.sequence), 0) + 1
FROM
items AS i
WHERE
company_id = 1), 'item 1 of company 1')
但是在Laravel中,我使用了create
方法的雄辩的批量分配来插入我的items
记录:
$company->items()->create($inputs);
在通过批量分配创建记录时,如何将模型sequence
属性定义为原始子查询?
答案 0 :(得分:1)
我相信您有两种解决方法,一种是使用items
模型上的模型事件在保存模型的任何时候设置sequence
字段,或者组合您的$inputs
包含子查询结果的数组。
第一种选择,使用模型事件。您只需在Items
模型中添加事件监听器:
protected static function boot(){
static::saving(function($thisModel){
$thisModel->attributes['sequence'] = your sub query;
});
}
只要保存模型,这将更新序列。如果您知道每次保存都需要对其进行更新,则可能会很好。如果仅在创建时需要执行此操作,则可以将saving
更改为creating
。如果您都不需要,还有很多其他选择。
另一个选择是将一个不同的查询添加到$inputs
数组中。
$subQuery = your sub query, using whatever you like.
$company->items()->create($inputs + ['sequence' => $subQuery]);
数组联合运算符+
应该可以使用。
答案 1 :(得分:1)
同一公司在不到一秒钟的时间内两次入职的可能性如何?我确定您不太可能不需要在这里使用原始语句。尽管这稍微有点儿受竞赛条件的影响,但在使用Eloquent时,它大大简化了您的问题。
$inputs['sequence'] = ($company->items()->max('sequence') ?? 0) + 1;
$company->items()->create($inputs);