Laravel 5: преобразовать построитель запросов в красноречивый

Есть ли способ преобразовать этот построитель запросов в красноречивый?

$users = DB::table('connections')
        ->join('locations','connections.to_user','=','locations.user_id')
        ->join('users','connections.to_user','=','users.id')
        ->select(
            DB::raw("*, IF((
                    3959 * acos(
                    cos(radians(".$lat."))
                    * cos(radians(latitude))
                            * cos(radians(longitude) - radians(".$lng."))
                            + sin(radians(".$lat."))
                            * sin(radians(latitude)))
                    ) < ".$distance.",true,false) near,(
                    3959 * acos(
                    cos(radians(".$lat."))
                    * cos(radians(latitude))
                            * cos(radians(longitude) - radians(".$lng."))
                            + sin(radians(".$lat."))
                            * sin(radians(latitude)))
                    ) AS distance")
        )
        ->where('status',3)
        ->orderBy("distance")
        ->get();

Модель подключения

public function getCreatedAtAttribute()
{
  return \Carbon\Carbon::parse($this->attributes['created_at'])->diffForHumans();
}

Поскольку с помощью построителя запросов невозможно вернуть атрибут created_at в «diffForHumans» Carbon.


person SoldierCorp    schedule 08.06.2015    source источник


Ответы (1)


Если все, что вам нужно, это Carbon::diffForHumans, вы можете просто преобразовать (отлить) created_at в Carbon.

Некоторые из возможных вариантов использования:

  • $dt = ( (Carbon) $row->created_at ) // Casting
  • $dt = Carbon::instance($row->created_at)

И я бы предложил сохранить запросы Fluent вместо преобразования в Eloquent, поскольку Eloquent действительно хорош только для простых CRUD и простых отношений.

Надеюсь это поможет :)

РЕДАКТИРОВАТЬ Еще пример:

/* $rows = (Fluent queries)->get() */

foreach ($rows as $row) {
    $row['created_at'] = Carbon::parse($row['created_at']);
}

Используйте вариант выше, если вы хотите продолжать использовать Fluent.

Если вы настаиваете на использовании Eloquent по какой-либо причине, вы не можете установить метод доступа, существующий как атрибут в модели.

e.g.:

getIdAttribute никогда не будет вызываться, потому что $model->attributes['id'] уже есть.

Если вместо этого вы определите getHumanCreatedAtAttribute, он будет вызываться
, поскольку $model->attributes['human_created_at'] отсутствует.

person pilus    schedule 09.06.2015
comment
Да, я всегда стараюсь делать свои запросы красноречивыми, а не с помощью построителя запросов, но поскольку мне нужно применить то приведение, которое вы написали в модели, приведение или преобразование атрибутов не работает (проверьте мой отредактированный пост) - person SoldierCorp; 09.06.2015
comment
+1 - это то, что я искал, используя diffForHumans(). Я согласен, иногда эффективнее использовать построитель запросов вместо красноречивого. - person Aakash; 13.07.2015