首页 > 解决方案 > Laravel Eloquent 获取数据(有关系)的困惑

问题描述

我对如何正确地从 Eloquent 模型中提取数据有点困惑。我确实阅读了文档,但是在任何地方都没有提到,或者我错过了。

假设我们有两个模型,Client并且Country(注意:我只添加了相关代码,否则这个问题会很长):

客户:

<?php

namespace App\Models\Client;

use App\Models\BaseModel;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

/**
 * @property int    id
 * @property int    country_id
 */
class Client extends BaseModel
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        ...
        'country_id',
        ...
    ];

    /**
     * Return Country relationship
     *
     * @return BelongsTo
     */
    public function country(): BelongsTo
    {
        return $this->belongsTo(Country::class);
    }
}

国家:

<?php

namespace App\Models\Country;

use App\Models\BaseModel;
use Illuminate\Database\Eloquent\Relations\HasMany;

/**
 * @property int    id
 */
class Country extends BaseModel
{
    public function clients(): hasMany
    {
        return $this->hasMany(Client::class);
    }
}

没什么特别的,两个普通型号。现在,当我尝试提取数据时,我遇到了一些问题:

那么,为什么所有错误的都是错误的呢?我是否错误地解释了文档?最令人沮丧的是dd(Country::with('clients')->findOrFail(32)->first()),现在我无法根据所选国家/地区进行过滤,然后还提供该国家/地区的客户列表。我认为 Eloquent 相当先进,所以我认为我做错了什么,并希望得到一些指导。请注意,在最新示例中,我还尝试将查询反转为dd(Country::findOrFail(32)->with('clients')->first()),结果相同。

标签: laraveleloquent

解决方案


在我看来,你在这里混淆了一些东西。例如,将 FindOrFail() 与 first() 组合是双倍的。看这里,这是我找到的一个很好的解释:

  1. find($id)接受一个 id 并返回一个模型。如果不存在匹配的模型,则返回 null。
  2. findOrFail($id)接受一个 id 并返回一个模型。如果不存在匹配的模型,则会引发错误 1。
  3. first()返回在数据库中找到的第一条记录。如果不存在匹配的模型,则返回 null。
  4. firstOrFail()返回在数据库中找到的第一条记录。如果不存在匹配的模型,则会引发错误 1。
  5. get()返回与查询匹配的模型集合。
  6. pluck($column)返回仅包含给定列中的值的集合。在之前的 Laravel 版本中,这个方法被称为列表。
  7. toArray()将模型/集合转换为简单的 PHP 数组。

来源:https ://stackoverflow.com/a/33027466/14807111


推荐阅读