Laravel получение данных от глубоких отношений - PullRequest
1 голос
/ 03 мая 2020

У меня есть 3 таблицы:

Users        | Baskets        | Items
--------------------------------------------
id           | id             | id
             | user_id        | basket_id
             |                | price

Я пытаюсь красноречиво установить отношения, по которым я могу получить все предметы и соответствующие корзины, где цена предметов равна X. Я хочу чтобы я мог просто использовать $ user-> items (x) и получить результаты.

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

Будем благодарны за помощь и руководство!

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Отношения, которые вы ищете, это hasManyThrough

https://laravel.com/docs/7.x/eloquent-relationships#has через многие

Модал пользователя

public function items()
{
    return $this->hasManyThrough(Item::class, Bucket::class);
}

То, как вы хотите использовать, невозможно достичь, я думаю.

Возможное использование

$user->items()->where('price', x);

, если вы определяете пользовательские области действия

Элемент Модальный

public function scopeWherePrice($query, $value)
{
    return $query->where('price', $value);
}

Использование

$user->items()->wherePrice(x);

РЕДАКТИРОВАТЬ

Если вы действительно хотите написать код, подобный $user->items(x), вы можете определить метод для User Modal.

. Обратите внимание, что это не отношение, а просто другой метод, извлекающий результат.

Пользовательский модал

public function items($price)
{
    return this->items()->where('price', $price)->get();
}
1 голос
/ 03 мая 2020

Использование hasManyThrough Определение отношения в ваших моделях:

Модель пользователя

 /**
 * Get all of the items & baskets for the user.
 */
 public function items($price)
 {
    return $this->hasManyThrough('App\Items', 'App\Baskets')
        ->with('basket')
        ->where('price',$price);
 }

Корзина Модель

 /**
 * Get the Items's Basket.
 */
 public function basket()
 {
    return $this->belongsTo('App\Basket','basket_id');
 }

И затем назовите это так:

 $user->items(x);

Это вернет все пользовательские предметы с соответствующими корзинами по определенной цене c.

...