自我加入Eloquent - 如何打电话

pan*_*hro 1 laravel eloquent laravel-4 laravel-5

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

所以

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

我需要做这个查询:

SELECT t2.title FROM products t1, products t2
WHERE t1.id = $id 
AND t2.color_id = t1.color_id AND
t2.id != $id
Run Code Online (Sandbox Code Playgroud)

我现在在我的产品型号上有这个:

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

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

但我怎么称呼这个?

Product::with('children')->find(1);
Run Code Online (Sandbox Code Playgroud)

以上获取id为1的产品,但也获得color_id为1的子项,我需要让color_id与id为product 1的孩子相同.

例如.

制品

id | title | color_id
 1    dvd       2
Run Code Online (Sandbox Code Playgroud)

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

MaG*_*tas 8

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

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

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

可能是最直接的方式:

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

您可以添加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();
Run Code Online (Sandbox Code Playgroud)

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

  • 雄辩的DOES确实加入了 (3认同)

bha*_*rat 6

你可以尝试这样的方法:

// Category.php
public function children()
{
    return $this->hasMany(Category::class, 'parent_id'); // you may use self::class instead of Category::class
}

public function parent()
{
    return $this->belongsTo(Category::class, 'parent_id'); // you may use self::class instead of Category::class
}

// To access
$category->children; // sub-categories collection

$category->parent; // parent instance
Run Code Online (Sandbox Code Playgroud)

基于: https: //laracasts.com/discuss/channels/eloquent/self-join-in-eloquent-model ?page=1