У меня есть таблица пользователей, где некоторые пользователи являются членами команды. Раньше у них было свойство под названием start
и end
. Эти свойства содержали целочисленное значение, которое представляло год, в котором они присоединились к команде, и год, в котором они покинули команду (например: 2015
). При попытке найти всех членов команды, которые ушли, я использовал следующий запрос, чтобы получить их по идентификатору роли (для бывшего члена команды 15
), а затем упорядочить их по году, в котором они остановились, что по своему Ход был заказан по тому году, в котором они начали, в котором по его туру снова было приказано их имя.
$team = User::where('role_id', '15')->orderBy('end', 'desc')->orderBy('start', 'asc')->orderBy('name', 'asc')->get();
Проблема в том, что end
и start
должны были быть более сложными. Они плохо относятся к школьным годам (В моем конкретном случае c; начиная с последней субботы августа и заканчивая пятницей до последней субботы августа следующего года, например, 2012-2013). Но у этих школьников есть темы, которые я тоже хочу связать с этими датами. В результате я создал новую таблицу со следующими полями, а также новое соединение с таблицей пользователей:
Schema::create('themes', function (Blueprint $table) {
$table->id();
$table->integer('start');
$table->integer('end');
$table->string('title');
$table->string('emblem');
$table->integer('active')->default(0);
$table->foreignId('user_id')->references('id')->on('users');
$table->timestamps();
});
Schema::table('users', function (Blueprint $table) {
$table->foreignId('start_theme_id')->nullable()->after('end')->references('id')->on('themes');
$table->foreignId('end_theme_id')->nullable()->after('end')->references('id')->on('themes');
});
Модель User
связывает эти 2 поля следующим образом:
public function start_date()
{
return $this->hasOne('App\Theme', 'id', 'start_theme_id');
}
public function end_date()
{
return $this->hasOne('App\Theme', 'id', 'end_theme_id');
}
Но тогда возникает вопрос этого запроса. Я знаю, что это можно сделать с помощью объединения, однако я также нашел with()
-метод, который, похоже, был специально создан для этого. Проблема в том, что, хотя я могу заставить его сортировать по дате окончания, дальше я не могу понять.
$team = User::where('end_theme_id', '!=', null)->with(['end_date' => function ($q) {
$q->orderBy('end', 'desc');
}])->get();
Поэтому мой вопрос: как я могу выбрать пользователей, а затем отсортировать их на основе поля end
отношения end_date()
в модальном User
, затем сортируйте их по полю start
отношения start_date()
в модели User
и, наконец, сортируйте по name
-поле самой User
-модели? Можно ли это сделать с помощью функции with()
, или я должен go использовать совершенно другой подход, например join()
? Я хотел бы по-прежнему иметь возможность использовать $user->end_date->title
и тому подобное, и не разбивать все вместе в User
-объекте, что является результатом, который я продолжаю получать с join()
.