сортировать коллекцию laravel по отношениям hasMany - PullRequest
0 голосов
/ 13 июня 2019

Я прочитал несколько вопросов на эту тему, но у меня не получилось. Ссылка

У меня есть две модели товара и цена, между товаром и ценой существуют многие отношения. в модели продукта:

public function price()
{
   return $this->hasMany("App\Price","product_id","id");
}

Я хочу отсортировать коллекцию товаров по цене. внутри моей модели цены у меня есть свойство цены. это мой код для сортировки товаров по соотношению цены и цене.

$products=Product::find($id);

$products->load(['price'=>function($q){
     $q->orderBy('price', 'asc');
}]);


dd($products->toArray());

пожалуйста, помогите мне. Спасибо.

Ответы [ 3 ]

0 голосов
/ 13 июня 2019

в модели продукта:

public function price()
    {
       return $this->hasMany("App\Price","product_id","id")->orderBy('price', 'asc');
    }

Это не может быть правильным способом. но это будет хорошо работать.

Я сделал две модели с двумя миграциями.

products table
 _ _ _ _ _ _ 
| id | name |
+-----------+
prices table
 _ _ _ _ _ _ _ _ _ _ _ _ _
| id | product_id | price |
+-------------------------+

Тогда я гарантирую свойство заполняемости на модели.

on Product.php
protected $fillable = ['name'];
on Price.php
protected $fillable = ['product_id', 'price'];

А затем установили связь с моделью товара.

on Product.php
public function prices()
{
    return $this->hasMany(Price::class, 'product_id', 'id')->orderBy('price', 'asc');
}

Тогда я вызываю выход.

$products = App\Product::with('prices')->get();

Это дает мне желание поставить порядок в порядке возрастания, как ваш вопрос выше. Перепроверьте эти детали,

1. you made your migrations properly.
2. you made the relations properly (check that data comes.).
3. you called them properly.
0 голосов
/ 14 июня 2019

наконец я нашел решение.

Теперь я могу сортировать коллекцию товаров по цене.

    $products=Product::find($id);
    $products=$products->load("price");
    $products=$products->sortBy(function($product){
        return $product->price;
    });

    dd($products->toArray());

Спасибо друзьям за помощь.

0 голосов
/ 13 июня 2019

Можете ли вы попробовать следующее?

$product = Product::with('price', function($query){
  $query->orderBy('price', 'asc');
})->find('id');

dd($product);

Или следующее, которое использует коллекцию

$product = Product::find($id);
$sorted = $product->price->sortBy('price');
dd($sorted);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...