gpt4 book ai didi

laravel - self 加入 Eloquent - 如何调用

转载 作者:行者123 更新时间:2023-12-04 14:30:31 25 4
gpt4 key购买 nike

我最近问了一个关于自联接的问题

SO

我得到了一个很好的答案,但我不知道如何称呼它。

我需要做这个查询:

SELECT t2.title FROM products t1, products t2
WHERE t1.id = $id
AND t2.color_id = t1.color_id AND
t2.id != $id

我现在在我的产品模型上有这个:
public function parent()
{
return $this->belongsTo(self::class, 'color_id');
}

public function children()
{
return $this->hasMany(self::class, 'color_id');
}

但是我怎么称呼它呢?
Product::with('children')->find(1);

上面得到id为1的产品,但也得到color_id为1的 child ,我需要得到color_id与产品1相同的 child 。

例如。

产品
id | title | color_id
1 dvd 2

当我选择第 1 行时,它应该选择 color_id 为 2 的所有其他产品。

最佳答案

我相信你们的关系不是他们应该的样子。通常它是一列(在您的情况下为外键 - color_id)具有另一列的值(在您的情况下通常是主键 - id)。

您拥有的基本上是记录共享的值或“类别”。所以你的产品不是“ child ”而是 sibling (具有相同的父颜色)。

with方法不是构建为 JOIN 语句,而是作为预先加载(单独查询),您可以手动执行此操作。

可能是最直接的方法:

$product1 = Product::find(1);
$children = Product::where('id', '<>', $product1->id)->
where('color_id', $product1->color_id)->
get();

您可以添加 select('title')到第二个“ builder ”以获得仅标题,但这将不再是您的模型。或者您可以使用 lists('title')如果您需要,则仅提取标题。

更新:

如果您最终决定需要 JOIN,我建议您使用原始查询构建器并将 Eloquent 排除在外:
$res = DB::table('products as t1')->
select('t2.title')->
join('products AS t2', 't2.color_id', '=', 't1.color_id')->
where('t1.id', 1)->
where('td2.id', '<>', 't1.id')->
get();

我相信它应该构建类似于您需要的东西。

关于laravel - self 加入 Eloquent - 如何调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30595166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com