从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
上下文
我在管理产品。这是一家鞋店。我想提供其他变体的视图。
数据库的形状是这样的:
例如,您可以有一双皮鞋 (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