Сортировать по свойствам 2 разных внешних ключей в Laravel - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть таблица пользователей, где некоторые пользователи являются членами команды. Раньше у них было свойство под названием 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...