У меня есть модель под названием 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
Devinajacket 19 Сен 2018 в 12:57

2 ответа

Лучший ответ

Чтобы отсортировать модель Встреча по столбцу из связанной модели Вариант , вам необходимо добавить ПРИСОЕДИНЕНИЕ к вашему запросу, чтобы можно было сортировать по связанные поля:

$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 () .

0
jedrzej.kurylo 19 Сен 2018 в 11:31

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

0
Anandu Krishna 19 Сен 2018 в 11:40