【问题标题】:Relationship doesnt work in Laravel关系在 Laravel 中不起作用
【发布时间】:2018-12-29 00:54:38
【问题描述】:

在我的用户模型中,我有 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].

类城市是

<?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();
 }

 }

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

【问题讨论】:

  • 愚蠢的问题,但 city() 是 App\User 中的一个方法,对吧? $user = App\User::findorfail(1)-&gt;with('city')-&gt;first(); 是一个很奇怪的电话,你为什么不直接打 User::with('city')-&gt;findOrFail(1); 呢?但是,当只加载一个模型时,急切加载关系的优势非常有限。
  • 是一样的。问题是它没有找到模型
  • 可能与错误无关,但删除first()findOrFail 将始终返回第一条记录,如果没有找到则失败。
  • 你也可以试着换个角度看:User::with('city')-&gt;findOrFail(1);.
  • 是的,City 是一个类似于模型类中声明的所有方法的方法。也是相同的 App\User::findorfail(1)->with('city')->first();和 User::with('city')->findOrFail(1)->first();

标签: php laravel relationships


【解决方案1】:

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

这应该是您使用User 急切加载City 所需的全部内容。

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

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

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

【讨论】:

  • 感谢您的回答,但这不是语法问题。通常它甚至不添加 with-> 来从关系方法中获取属性。我测试了你的查询,但没有用。它适用于我早期版本的项目。我现在相信我在配置中搞砸了一些东西,但我不知道是什么。我想我会重新安装并重试。
  • 我创建了一个新的 Laravel 应用程序并编写了一个包含所有 3 个查询的测试(您原来的 + 我的两个解决方案),它们似乎都工作正常。检查App\User::class 是否确实返回了您所期望的用户类的实例。
【解决方案2】:

将代码$this-&gt;belongsTo(City::class, 'city_id') 视为与hasOne 关系相反的关系,最终将查看“用户所属”的城市?

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

【讨论】:

  • 不行,一个用户有一个城市,一个城市可以有很多用户!感谢您的尝试
  • 在所有其他模型中,与城市的相同关系我的意思是除了用户之外工作正常。我相信该系统与laravel bild 的另一个用户类混淆了。虽然我不知道我该如何解决这个问题
  • 我明白了,这也是我确认它的用例的原因,无论如何你是否以某种方式使用 laravel 护照进行身份验证?或者可能一直在使用它,最近才决定停用它?你可能需要做一个 composer dump-autoload 来重新加载这个类,或者你可以通过在 User 模型中添加一个命名空间来测试是否存在命名空间冲突,希望对你有帮助。
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 2015-09-24
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多