我的应用中有2个型号,'用户'和'MedicineType'(每个用户属于一种MedicineType)。
我使用belongsTo()和hasMany()在两个模型之间建立了一对多关系。 hasMany()关系工作正常但belongsTo()不起作用。有谁知道我在哪里弄错了?
User :: find(1) - > medicine_type [this return nothing]
MedicineType :: find(1) - > users [this returns users]
以下是Models的代码:
class MedicineType extends Eloquent {
public function users()
{
return $this->hasMany('User');
}
}
class User extends Eloquent {
public function medicine_type()
{
return $this->belongsTo('MedicineType');
}
}
这是我的数据库结构:
users:
id
name
medicine_type_id
medicine_types:
id
name
答案 0 :(得分:40)
您的关系不起作用的原因不是因为模型中指定的关系,而是因为用户模型中的方法命名而未指定外键。
而不是:
public function medicine_type()
{
return $this->belongsTo('MedicineType');
}
使用:
public function medicineType()
{
return $this->belongsTo('MedicineType', 'id');
}
我希望这适合你;)
一切都在一起:
<?php // app/models/MedicineType.php
class MedicineType extends Eloquent {
// Determines which database table to use
protected $table = 'medicine_types';
public function users()
{
return $this->hasMany('User');
}
}
和:
<?php // app/models/User.php
class User extends Eloquent {
// Determines which database table to use
protected $table = 'users';
public function medicineType()
{
return $this->belongsTo('MedicineType', 'id');
}
}
测试是否有效:
$user = User::find(1);
return $user->medicineType->name;
这会成功返回相关的medicine_type名称。
我希望这会对你有所帮助;)
答案 1 :(得分:9)
也许Eloquent找到外键存在问题。试试这个:
class User extends Eloquent {
public function medicine_type()
{
return $this->belongsTo('MedicineType', 'medicine_type_id');
}
}
编辑:
此外,Eloquent尝试找到表“medicinetypes”而不是“medecine_types”,所以你需要使用$table
变量来指定它。
class MedicineType extends Eloquent {
protected $table = 'medicine_types';
public function users()
{
return $this->hasMany('User');
}
}
答案 2 :(得分:3)
我犯了一个愚蠢的错误,即没有添加&#34; return&#34;在关系方法!
确保你恢复关系......显然这将不工作:
public function medicineType()
{
$this->belongsTo('MedicineType', 'id');
}
答案 3 :(得分:1)
我改变&#34; medicine_type&#34; to&#34; medicineType&#34;一切都好......
答案 4 :(得分:0)
在我的情况下,相关模型数据已删除,而laravel在一般查询中不会获得软删除的数据。要获取软删除的数据,您必须使用“ withTrashed()或onlyTrashed()”。
您可以在此处查看文档。
答案 5 :(得分:0)
在大多数情况下,第一投票的答案可能是最好的答案。但是,如果您仍然在加载相关关系时遇到麻烦,也没有运气。
还有另一件事可能起作用。查看每个模型的表及其索引或外键。就我而言,我已更改了表名,但从未更新所涉及的索引和外键。
解决方案。
A :(感觉很懒)只需删除关联的索引或外键即可。
B :(我不是很懒)通过laravel迁移删除表,并使用适当的外键重新运行工匠迁移。
答案 6 :(得分:0)
型号:
class User extends Eloquent {
public function medicine_type()
{
return $this->belongsTo('MedicineType');
}
}
UserController.php
$users= App\User::all();
foreach ($users as $user) {
echo $user->medicine_type->name;
}