Laravel 5.1对模型应用雄辩的关系会引发修补程序中找不到的类

时间:2015-07-05 06:58:03

标签: php laravel eloquent laravel-5

我正在关注Laravel 5.x Laracast视频系列,现在它是关于设置Eloquent关系,除了所涉及的课程之外,我写的完全相同,但我不断获得“Class App”找不到车辆“我试图在修补程序中测试时出错。这是正确的没有车辆模型,但由于模型是单数的,所以我不确定为什么错误被抛出。我运行了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而不是文章没有任何区别。

更新

在第一个问题的帮助下,第一个问题已经解决,但是调用:

App\Vehicle::first()->owner->toArray();
belongsTo关系上的

会抛出错误说:

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

2 个答案:

答案 0 :(得分:3)

我花了很长时间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'参数。

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

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

答案 1 :(得分:0)

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

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