【问题标题】:Laravel 5: Convert query builder to eloquentLaravel 5:将查询构建器转换为 eloquent
【发布时间】:2015-06-08 22:36:41
【问题描述】:

有没有办法将此查询生成器转换为 eloquent?

$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 属性。

【问题讨论】:

    标签: php eloquent laravel-5 query-builder php-carbon


    【解决方案1】:

    如果您想要的只是Carbon::diffForHumans,您可以将created_at 转换(转换)为Carbon。

    一些可能的用法:

    • $dt = ( (Carbon) $row-&gt;created_at ) // Casting
    • $dt = Carbon::instance($row-&gt;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-&gt;attributes['id'].

    如果改为定义getHumanCreatedAtAttribute,它将被调用
    因为没有$model-&gt;attributes['human_created_at']

    【讨论】:

    • 是的,我总是尝试使用 eloquent 而不是使用查询生成器进行查询,但是由于我需要应用您在模型中编写的演员表,因此演员表或属性转换不起作用(查看我的帖子已编辑)
    • +1 - 这就是我使用 diffForHumans() 所寻找的。我同意,有时使用查询生成器而不是 eloquent 更有效。
    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    相关资源
    最近更新 更多