从parent id获取siblings并排除自身Laravel关系

Get siblings from parent id and exclude itself Laravel relationship

上下文

我在管理产品。这是一家鞋店。我想提供其他变体的视图。

数据库的形状是这样的:

例如,您可以有一双皮鞋 (id 1),这款鞋有 3 种款式:黑色 (id 1)、棕色 (id 2) 和灰色 (id 3)。

我尝试做的是构建一个 Laravel 关系,以便能够从一个变体中获得它的兄弟姐妹。根据我提到的示例,这是数据库中的样子。

SHOE
id
====
1

SHOE_VARIANT
id  shoeId  colorId
===================
1   1       1
2   1       2
3   1       3
...
8   2       5
9   3       2
10  3       4

在这种情况下,如果用户正在查看黑色变体 (id 1),我希望我可以向他展示其他 2 个变体(棕色,id 2 和灰色,id 3)。

问题

如何构建 Laravel 关系以便从父 ID 检索兄弟姐妹,并确保不包括当前记录本身?

实验

我已经尝试构建如下所示的关系,但包含当前记录本身,我不知道如何排除记录本身,因为我没有找到如何获取记录的当前 ID。

// app/ShoeVariant.php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ShoeVariant extends Model {
  public function siblings() {
    return $this->hasMany("App\ShoeVariant", "shoeId", "shoeId");
  }
}

这意味着:

For the current shoe variant, get the shoe variants that matches knowing that you should match the foreign column named "shoeId" and the local column named "shoeId"

因此,如果 2 款鞋款共享同一列 "shoeId",则此方法有效。卡在从这些结果中排除当前记录。

这应该可以满足您的要求:

public function siblings() {
    return $this->hasMany('App\ShoeVariant', 'shoeId', 'shoeId')
                ->where('id', '!=', $this->id);
}

只需通过 id 筛选出当前变体并获取所有其他变体。

或者,您可以创建一个新的 属性:

public function getVariantsAttribute() {
    return $this->siblings->reject(function($elem) {
       return $elem->id == $this->id;
    });
}

然后在如下代码中使用它:

$variants = $model->variants; // all except this one