Получить братьев и сестер из родительского идентификатора и исключить себя Laravel отношения - PullRequest
0 голосов
/ 01 февраля 2020

КОНТЕКСТ

Я управляю продуктами. Это обувной магазин. Я хотел бы предложить представление о других вариантах.

База данных имеет следующую форму:

enter image description here

Например, вы можете у меня есть кожаный ботинок (id 1), и есть 3 варианта этого ботинка: черный (id 1), коричневый (id 2) и серый (id 3).

Что я пытаюсь сделать do - построить отношение 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), я могу показать sh ему 2 других варианта (коричневый, id 2 и серый, id 3).

ВОПРОС

Как я могу построить отношение Laravel для извлечения братьев и сестер из родительского идентификатора и убедитесь, что сама текущая запись не включена?

ЭКСПЕРИМЕНТЫ

Я уже пытался построить отношения, как показано ниже, но текущая запись сам по себе включен, и я не могу понять, как исключить саму запись, потому что я не нашел, как получить текущий идентификатор записи.

// app/ShoeVariant.php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

Это означает:

Для текущего варианта обуви, получите варианты обуви, которые соответствуют, зная, что вы должны соответствовать внешнему столбцу с именем «shoeId» и локальному столбцу с именем «shoeId»

Так что, если 2 варианта обуви имеют общий тот же столбец "shoeId", эта работа s. Застрял в исключении текущей записи из этих результатов.

1 Ответ

1 голос
/ 01 февраля 2020

Это должно делать то, что вы хотите:

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

Просто отфильтруйте текущий вариант по идентификатору и получите все остальные.

В качестве альтернативы, вы можете просто создать новое свойство:

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

А затем используйте его в коде:

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