Laravel属于不工作

时间:2014-06-28 17:05:49

标签: php laravel orm laravel-4 eloquent

我的应用中有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

7 个答案:

答案 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()”。

您可以在此处查看文档。

https://laravel.com/docs/5.6/scout#soft-deleting

答案 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;
}