Сортировка родительской модели на основе дочерней модели / отношений - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть модель с именем appointments, у каждой встречи есть option_id, которая связана через отношения один к одному, и option_id также может быть null.Опционная модель имеет свойство datetime_start.Я хочу отсортировать встречи на основе option.datetime_start.

Вот мой код:

$appointments = $user->appointments()
->with(['option'
])
->get();

Редактировать:

Модель назначения:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Appointment extends Model
{
   /**
         * @return \Illuminate\Database\Eloquent\Relations\HasOne
   */
   public function option()
   {
     return $this->hasOne(Option::class, 'id', 'option_id');
   }
}

Опционная модель:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Option extends Model
{
    protected     $fillable = ["appointment_id",
                               "datetime_start"
    ];

    public function appointment()
    {
        return $this->belongsTo(Appointment::class, 'id','appointment_id');
    }
}

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

$appointments = Appointment::with(['option' => function ($query){ $query->orderBy('datetime_start', 'desc'); } ])->get();

0 голосов
/ 19 сентября 2018

Чтобы отсортировать модель Встреча по столбцу из связанной модели Опция , необходимо добавить JOIN в запрос, чтобы можно было выполнить сортировку посвязанные поля:

$appointments = $user->appointments()
  ->leftJoin('options', 'options.appointment_id', '=', 'appointments.id')
  ->orderBy('options.datetime_start', 'ASC')
  ->with(['option'])
  ->get();

Это даст вам все встречи, в том числе без Option - без Option и, следовательно, без datetime_start, все будет возвращено либо в начале, либо в конце списка результатов, вам нужно это проверить.Если вам нужны встречи только с Option , замените leftJoin () на join () .

...