【问题标题】:Laravel Eloquent instead of Query BuildLaravel Eloquent 代替查询构建
【发布时间】:2021-08-17 10:34:16
【问题描述】:

如何将以下 Laravel (v8) Query 转换为 Eloquent?这可能吗?

'house_id' => DB::table('houses') ->select('id') ->where('user_id', Auth::user()->id) ->orderByDesc('created_at')->value('id')

当前的查询正在完成这项工作,但我很想知道 Eloquent 是否也能做到这一点。换句话说,有更优雅的方式来做同样的事情吗?

对不起,如果我的问题完全没有意义。

非常感谢您的澄清。

【问题讨论】:

    标签: laravel eloquent laravel-query-builder


    【解决方案1】:

    如果您的模型名为 House$house = House::query()->where('user_id', Auth::user()->getAuthIdentifier())->select('id')->orderBy('created_at', 'DESC')->get() 或如果您只想获得一个元素,请使用 ->first()。然后你可以拨打$house->id

    【讨论】:

    • 你好 Takachi,我只是想获取房子的 ID 值。是的,我的模型叫做 House。
    • 编辑了我的答案。但是select('id')只选择房子的id,也可以用->first('id')代替->select('id)->get()
    • 喜欢吗? House::query() ->where('user_id', Auth::user()->getAuthIdentifier()) ->select('id') ->orderBy('created_at', 'DESC') ->first( 'id') ->get();作为回应,我只想要一个整数,没有别的。
    • House::query()->where('user_id', Auth::user()->getAuthIdentifier())->orderBy('created_at', 'DESC')->first( 'id')
    • DB::table('houses') ->select('id') ->where('user_id', Auth::user()->id) ->orderByDesc('created_at')->value('id'); 返回 50(例如)House::query()->where('user_id', Auth::user()->getAuthIdentifier())->orderBy('created_at', 'DESC')->first('id') 返回如下:App\Models\House {#1442 ▼ #table: "houses" #guarded: [] #fillable: array:8 [▶] # ... #attributes: array:1 [▼ "id" => 50 ] 如何获取 ID?
    【解决方案2】:

    Laravel 在查询构建器上有一个latest() 函数,它按created_at 日期对结果进行降序排序。因此,您可以将查询简化为:

    House::where('user_id', Auth::user()->id)->latest()->first()->id;
    

    这可能看起来令人困惑,latest()->first(),但latest() 返回一个collection,因此如果您使用first() 访问最新记录,然后从模型中获取id

    如果您发现自己经常使用上述方法,您可以更进一步,在您的 User 模型上定义一个 scope

    public function houses()
    {
        return $this->hasMany(House::class);
    }
    
    public function scopeLatestHouse(Builder $query) {
        return $this->houses()->latest()->first();
    }
    

    现在你需要做的就是:

    $latestHouse = Auth::user()->latestHouse()->id;
    

    【讨论】:

    • 顺便说一句,请您参考一个好的资源(教程),我可以在其中了解更多关于 Eloquent 的信息(不在 Laravel 文档中)。我会很感激的!
    • @ack2v Laravel 8 from Scratch 是一个很好的资源,其中有关于 Eloquent 的部分。 Laracasts 通常是一个很好的资源。并非所有课程都是免费的,但它们质量很好,值得在您认为合适时订阅(即一些更高级的主题)。
    猜你喜欢
    • 2020-03-19
    • 2018-10-27
    • 2016-03-30
    • 2016-02-09
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    相关资源
    最近更新 更多