【问题标题】:Laravel 5.1 Applying Eloquent Relationships to Models Throws Class Not Found in TinkerLaravel 5.1 将 Eloquent 关系应用于模型抛出在 Tinker 中找不到的类
【发布时间】:2015-09-22 12:58:28
【问题描述】:

我正在关注 Laravel 5.x Laracast 视频系列,现在它是关于建立 Eloquent 关系的,除了涉及的类之外,我写的完全一样,但我一直得到一个“类应用程序”当我尝试在修补程序中进行测试时出现“未找到车辆”错误。没有 Vehicles 模型是正确的,但是由于模型是单一的,所以我不确定为什么会抛出错误。我已经运行了 composer dump-autoload 所以不是没有看到文件。

用户模型

/**
 * A user can have many vehicles.
 *
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function vehicles() {

    return $this->hasMany('App\Vehicle');
}

车辆模型

/**
 * A vehicle is owned by a user
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
 */
public function owner()
{
    return $this->belongsTo('App\User');
}

数据库迁移和种子成功,我已经验证了种子中的数据库记录。

修补匠

$user = App\User::first(); // provides the proper user with id = 1
$vehicle = App\Vehicle::first(); // provides the proper vehicle with user_id of 1

但是

$user->vehicles->toArray(); // Throws the "Class App\Vehicles Not Found error"

我已经观看了 3 次视频以尝试发现任何问题,除了将模型命名为 Vehicle 而不是 Article 之外,没有任何区别。

更新

在帮助下第一个问题得到解决,但调用:

App\Vehicle::first()->owner->toArray();

在belongsTo关系上抛出一个错误说:

[Symfony\Component\Debug\Exception\FatalErrorException]
Call to a member function toArray() on null

【问题讨论】:

  • 你是不是一开始不小心把return $this->hasMany('App\Vehicles');写成复数形式,然后没有重新加载Tinker?这是我唯一能想到的。
  • 嗨@JoelHinz,可以。我不知道你必须重新启动 Tinker。我只是假设它有一个手表。非常感谢!!!
  • 去过那里,做过...太多次了。 :) 很高兴它对你有用。
  • @JoelHinz 你知道为什么车辆的 belongsTo 关系会为空吗?第一部分 App\Vehicle::first() 有效,但所有者的模型关系返回 null 导致 toArray() 失败。我检查了关系、迁移和数据库的记录。
  • 可能是因为你没有调用方法user而是owner,你需要指定表和/或键。不确定。

标签: php laravel eloquent laravel-5


【解决方案1】:

先获取车辆对象,然后调用所有者模型,像这样

$vehicle = App\Vehicle::first();
$vehicle->owner->toArray();

【讨论】:

    【解决方案2】:

    我花了一段时间,最终garethdaine 花了一段时间通过反复试验来解决这个问题,结果发现文档中实际上有一段关于这个的段落哈哈。如下:

    owner 关系找不到任何对应的用户,因为它正在寻找错误的列。

    Eloquent 通过检查关系方法的名称并在方法名称后加上 _id 来确定默认的外键名称。但是,如果 Phone 模型上的外键不是 user_id,您可以将自定义键名称作为第二个参数传递给 belongsTo 方法:

    /**
     * Get the user that owns the phone.
     */
    public function user()
    {
        return $this->belongsTo('App\User', 'foreign_key');
    }
    

    在您的情况下,它正在寻找 owner_id 而不是 user_id。因此,要么将方法重命名为 user,要么按照示例指定 'foreign_key' 参数。

    你可以通过输入dd(App\Vehicle::first()->owner)来查看关系模型,其中包含Eloquent设置的foreign_key属性。

    另外,请考虑研究 eagerlazy loading 以解决 n+1 问题。

    【讨论】:

    • 我的荣幸。请注意,此行为特定于 belongsTo。所有其他关系实际上都使用模型名称来自动确定表和列。你的困惑是可以理解的。他们为什么选择这种方法对我来说是个谜,但是是的。幸运的是,我们可以选择覆盖和很棒的文档!
    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2016-04-12
    • 2021-10-01
    • 2018-10-20
    • 2021-07-04
    • 1970-01-01
    • 2015-05-20
    相关资源
    最近更新 更多