我正在关注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
答案 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)
来查看关系模型。
另外,请考虑查看eager或lazy loading以解决n + 1问题。
答案 1 :(得分:0)
首先获取车辆对象然后调用所有者模型,就像这样
$vehicle = App\Vehicle::first();
$vehicle->owner->toArray();