关系在Laravel中不起作用

时间:2018-07-20 16:49:56

标签: php laravel relationships

在我的用户模型中,我有2个关联

 public function role()
{
    return $this->belongsTo(Role::class, 'role_id');
}

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

我使用时第二个城市不起作用

$user = App\User::findorfail(1)->with('city')->first(); 

例如。它给出了消息

Illuminate/Database/Eloquent/RelationNotFoundException with message 'Call to undefined relationship [city] on model [App/User].

Class City是

<?php
 namespace App;

 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;


 class City extends Model
 {
 use SoftDeletes;

 protected $fillable = ['name', 'nomos_id','user_id'];
 protected $table = 'cities';


 public function setNomosIdAttribute($input)
 {
    $this->attributes['nomos_id'] = $input ? $input : null;
 }

 public function nomos()
 {
    return $this->belongsTo(Nomoi::class, 'nomos_id')->withTrashed();
 }

 }

出什么问题了?为什么一种关系有效而另一种无效。

2 个答案:

答案 0 :(得分:0)

将代码$this->belongsTo(City::class, 'city_id')视为hasOne关系的逆向对象,该关系最终将寻找“用户所属”的城市?

这是此关系结构的预期目的吗?如果与它成反比,那么我们正在寻找一个“属于用户”的城市,如果它是一对多关系,则应该使用$this->hasOne(City::class, 'city_id')中的$this->hasMany(City::class, 'city_id')

答案 1 :(得分:0)

with()调用应在find()first()findOrFailfirstOrFail()get()之前进行

这应该是您渴望向City加载User的全部。

$user = App\User::with('city')->findOrFail(1); 

但是,如果您需要在first()上显式调用City,则应该使用:

$user = App\User::with(['city'->function($query){ 
    return $query->first();
})->findOrFail(1);