2

有没有办法将此查询生成器转换为雄辩的?

$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();
}

因为使用查询生成器无法返回 Carbon 的“diffForHumans”中的 created_at 属性。

4

1 回答 1

0

如果您想要的只是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,则无法设置作为模型中的属性存在的访问器。

例如:

getIdAttribute永远不会被调用,因为已经有了 $model->attributes['id'].

相反,如果您定义 a getHumanCreatedAtAttribute,它将被调用
,因为没有$model->attributes['human_created_at']

于 2015-06-09T07:08:29.157 回答