Трехуровневое красноречивое отношение orderBy в laravel 5 - PullRequest
0 голосов
/ 03 января 2019

В моей базе данных у меня есть следующие таблицы:

quotes
-id
-quote_title
...

quote_items
-id
-quote_id
-product_id

products
-id
-product_name
-product_category_d

Я хочу добиться того, чтобы отсортировать результат моего запроса с помощью product_category_id.

Ниже приведен запрос.

$query = Quote::query();
$query->whereHas('quote_item' , function ($query) {
    $query->whereHas('product' , function ($query) {
        $query->orderBy('product_category_id');
    });
 });
$temp= $query->find($id);

Результат не показывает ошибок, но не в порядке.

Модель:

class Quote extends Model
{
    public function QuoteItem()
    {
        return $this->hasMany('app\QuoteItem');
    }
}

Модель:

class QuoteItem extends Model
{
    public function Quote()
    {
        return $this->belongsTo('app\Quote');
    }

    public function Product()
    {
        return $this->belongsTo('app\Product');
    }
}

Модель продукта:

class Product extends Model
{
    public function QuoteItem()
    {
        return $this->hasMany('app\QuoteItem');
    }

}

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Я бы порекомендовал создать выделенную область для Quote модели:

public function scopeOrderByCategory($query)
{
    return $query
        ->join('quote_items', 'quote_items.quote_id', '=', 'quotes.id')
        ->join('products', 'products.id', '=', 'quote_items.product_id')
        ->orderBy('products.product_category_id');
}

Затем вы можете использовать его, когда выбираете кавычки и вам нужно упорядочить их по категории продукта:

$quotes = Quote::orderByCategory()->get();

Но вы должны быть осторожны с тем, что эта область видимости объединяет таблицы quote_items и products.

Подробнее о локальных областях применения Eloquent можно прочитать здесь здесь .

0 голосов
/ 03 января 2019

Если вы внимательно посмотрите в своем запросе, порядок был помещен в предложение whereHas.Я думаю, что это должно быть вставлено в with предложение

Я изменил запрос следующим образом.

$results = Quote::with(['QuoteItem' => function ($query) {
                            $query->join('products', 'products.id', 
                                         '=', 'quote_items.product_id')
                                  ->orderBy('product_category_id','ASC');
                        }])->whereHas('QuoteItem')->find($id);

Результаты показаны с использованием функции dd() Laravel: enter image description here

...