Laravel Eloquent使用关联列更新列

3

如何实现这个查询?

Sale::with(['catalog'])
    ->whereIn('id', $ids)
    ->update(['price' => DB::raw('catalog.price')]);

这个不起作用,它显示未定义的表... 我试着输入表的名字,但结果还是一样。

在互联网上,我总是找到简单的查询:

Sale::with(['catalog'])
    ->whereIn('id', $ids)
    ->update(['price' => 5]);

好的!当我想要更新所有行为相同值时,这很容易。此外,如果您想使用同一表的列进行更新,也很容易,就像:

Sale::with(['catalog'])
    ->whereIn('id', $ids)
    ->update(['price' => DB::raw('price_alternative')]);

那么如何使用另一个具有关联关系的表的列呢?我还没有找到解决办法。

我知道可以使用整个原始查询来解决,但是我想知道是否可以通过Eloquent方式实现。

2个回答

5
您可能需要在您的查询构建器上加入 catalog 表,而不是使用 with()。以下是类似的示例代码:
Sale::whereIn('id', $ids)
    ->join('catalog', 'sales.catalog_id', '=', 'catalog.id')
    ->update(['price' => DB::raw('catalog.price')]);

是的,我考虑过这个问题。我总是尝试使用关系而不是连接,但如果没有其他选择,我会选择这个。谢谢。 - Marc Pont
确实,如果适用的话最好使用关系,但这是需要使用连接的情况之一。干杯! - Qirel

0

这并不比@Qirel的答案更好,但它是一种雄辩的方式,我喜欢这个因为更加清晰明了。

$Sales = Sale::whereIn('sales.id', $ids)
    ->with('Cat')->get();

$Sales->map(function($q){
    $q->price = $q->Cat->price;
    $q->save();
});

假设您在销售模型中有以下关系代码:

public function Cat()
{
    return $this->hasOne(CatModel::class, 'id', 'catalog_id');
}

3
根据$ids的长度,这可能会对性能产生巨大影响。 - Marc Pont
我知道,但是尝试一种“纯粹”的Eloquent方式。您可以使用Chunk和Transaction来控制性能。这就是为什么我说“这并不比@Qirel的答案更好”的原因。 - Trần Hữu Hiền

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接