Laravel-使用子查询创建模型

时间:2019-03-07 20:22:48

标签: php mysql laravel

我有一个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属性定义为原始子查询?

2 个答案:

答案 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);