雄辩的自我加入-如何打电话

Panthro

我最近问了一个关于自我加入的问题

所以

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

我需要执行以下查询:

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的孩子,我需要获得color_id与产品1的id相同的孩子。

例如。

产品

id | title | color_id
 1    dvd       2

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

马格尼塔斯

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

您所拥有的基本上是记录共享的值或“类别”。因此,您的产品不是“孩子”,而是兄弟姐妹(具有相同的父颜色)。

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

可能是最直接的方法:

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

您可以添加select('title')到第二个“构建器”中,以仅获得标题,但这不再是您的模型。或者,您可以根据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();

我相信它可以构建与您需要的东西类似的东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章