2016-06-16 2 views
0

Короткий вопрос

Использование ярких моделей Laravel; как упорядочить запрос столбцом на a имеет morphMany полиморфные отношения?Результаты заказа по шкале Laravel по столбцу на полиморфном столе

Longer вопрос

Скажет, у меня есть данная структура таблицы:

// table: images 
+ -- + ------------ + -------------- + ----- + ----------- + 
| id | imageable_id | imageable_type | views | upload_date | 
+ -- + ------------ + -------------- + ----- + ----------- + 
| 1 | 1   | User   | 100 | 2016-16-06 | 
| 2 | 3   | User   | 200 | 2016-16-06 | 
+ -- + ------------ + -------------- + ----- + ----------- + 

// table: users 
+ -- + ---- + 
| id | name | 
+ -- + ---- + 
| 1 | Bob | 
| 2 | Kat | 
+ -- + ---- + 

... и у меня есть Красноречивый User модели с morphMany полиморфными отношениями.

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

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

User::with([ 
    'images' => function ($query) { 
     $query->where('upload_date', Carbon::today()->toDateString()) 
      ->orderBy('views', 'DESC'); 
    } 
])->get(); 

Но, попробовав это, было очевидно для меня, что пользователи теперь неправильно упорядочены по их увеличивающемуся идентификатору, а не столбец views на столе images.

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

ответ

1

Я понял это благодаря комментарию к этому сообщению http://laravel.io/forum/02-21-2014-order-and-paginate-a-collection-by-a-releted-field-using-eloquent.

User::leftJoin('images', function ($join) { 
    $join->on('users.id', '=', 'images.imageable_id') 
     ->where('imageable_type', '=', 'User') 
     ->where('upload_date', '=', Carbon::today()->toDateString()); 
}) 
    ->orderBy('images.views') 
    ->select(['players.*']); 

Я пытался что-то похожее на это раньше, но был сталкиваюсь с проблемами, так как идентификаторы и другие столбцы, сталкивались между двумя соединенными таблицами. Разница на этот раз ->select(['users.*']). Теперь возвращаются только данные пользователя.

2

В качестве альтернативы вы также можете использовать методы коллекции sortBy.

$users = User::with([ 
    'images' => function ($query) { 
     $query->where('upload_date', Carbon::today()->toDateString()); 
    } 
])->get()->sortByDesc(function ($user) { 
    return $user->images->views; 
}); 
Смежные вопросы