[英]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('...');
}
City
和Citizen
之间的关系是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.