繁体   English   中英

Laravel hasMany 关系不返回没有括号的值

[英]Laravel hasMany relationship not resturning values without parentheses

所以我有这个模型,比如City 它与另一个模型(例如Citizen具有 OneToMany 关系。

在城市模型上,我定义了一个关系辅助函数

public function citizens()
{
    return $this->hasMany(Citizen::class, 'city_id', 'id');
}

现在我的问题是,在命令中,我有:

$cities = City::with('citizens')->get();
foreach ($cities as $city) {
    $citizens = $city->citizens->pluck('user');
}

然而它没有返回任何东西。 为了获得价值,我必须把这条线变成

$cities = City::all();
foreach ($cities as $city) {
    $citizens = $city->citizens()->get()->pluck('user');
}

有没有人知道这是怎么发生的? 今天开始发生这种情况,没有明显的原因。

编辑

为了进一步说明情况,

$cities = City::with('citizens')->get();
foreach ($cities as $city) {
    dd($city->citizens()->count()); // => 5
    dd($city->citizens->count()); // => 0
}

这是模型定义

// City.php

class City extends Model
{
    use Searchable;

    protected $table = 'cities';
    public $incrementing = false;
    protected $perPage = 20;

    protected $fillable = [
        'name',
        'unique_code',
        'extra_attributes'
    ];

    protected $casts = [
        'id' => 'string',
        'codes' => 'array',
        'extra_attributes' => SchemalessAttributes::class,
    ];

    public static function boot()
    {
        parent::boot();
        self::creating(function ($model) {
            $model->id = $model->id ?: Str::orderedUuid();
        });
    }

    public function toSearchableArray(): array
    {
        return [
            'name' => $this->name,
        ];
    }
 
    public function citizens()
    {
        return $this->hasMany(Citizen::class, 'city_id', 'id');
    }
}


// Citizen.php

class Citizen extends Model
{
    public $incrementing = false;
    protected $perPage = 20;
    protected $table = "citizens";

    protected $fillable = [
        'user_id',
        'level_id',
        'city_id',
    ];

    public static function boot()
    {
        parent::boot();
        self::creating(function ($model) {
            $model->id = $model->id ?: Str::orderedUuid();
        });
    }

    public function user() {
        return $this->hasOne(User::class, 'id', 'user_id')->withTrashed();
    }
 
    public function city() {
        return $this->hasOne(City::class, 'id', 'city_id');
    }
}

解决此问题的最佳方法是在获取城市时急切加载市民,这样您就不会执行太多查询(因为您必须单独获取每个城市的市民),这将为您节省很多如果您这样做,将来数据库变大时的执行时间:

$cities = City::with('citizens')->get();
foreach($cities as $city) {
    $items = $city->citizens->pluck('...');
}

CityCitizen之间的关系是City hasMany Citizens...

在 Laravel 中,hasMany 关系反向是belongsTo Not hasOne,参见Laravel doc

所以你应该像这样更正公民模型中的关系:

public function city() {
        return $this->belongsTo(City::class, 'city_id');
    }

有两个问题,OMR 强调了其中一个问题(您在 Citizen 类中使用了不正确的关系),但这不是主要问题。 您正在尝试建立另一个关系,但除非您明确告诉它,否则 Laravel 不会急于加载该关系。 您只是告诉它急切加载 Citizen 关系,而不是 User 关系。 幸运的是,Laravel 确实支持嵌套关系 您需要这样更新您的查询:

$cities = City::with('citizens.user')->get();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM