了解Laravel中的hasOne()和belongsTo()函数

时间:2018-04-15 12:14:54

标签: php mysql laravel orm relationship

我所要做的就是了解我应该何时使用hasOne(),何时应该使用belongsTo()。两者看起来都和我一样。例如,这是我的模型:

use Illuminate\Database\Eloquent\Model;
use App\Categories;
use App\User;


class tickets extends Model
{
    protected $table = "tickets";

    public function category()
    {
        return $this->hasOne(Categories::class, 'id', 'category_id');
    }

    public function user()
    {
        return $this->hasOne(User::class, 'id', 'user_id');
    }
}

我也可以使用belongsTo()函数来做同样的事情。我应该将它们放入usercategory模型中。无论如何,我应该何时使用hasOne()belongsTo()

4 个答案:

答案 0 :(得分:3)

在处理1对多关系时,您将拥有hasMany()belongsTo()

我使用的经验法则是,如果表具有外键(票证表具有user_id fk),那么此模型belongsTo用户。 与分类相同。

上面的示例Ticket belongsTo User& Category

相反,User hasMany Ticket和类似Category hasMany Ticket

答案 1 :(得分:2)

  

无论如何,我什么时候应该使用hasOne()或belongsTo()?

如果将来可能存在一对多的关系,请将其视为hasMany。例如:考虑用户和手机型号。关系的性质将是用户hasOne电话,但如果您想扩展其功能,那么用户可以注册多个电话号码用户仍然会有has*关系,而电话会保留belongsTo关系。只考虑哪一个可能是“父”实体,并且在方法中应该有hasOne关系。我总是将User视为父实体,对我来说逻辑上是用户有一张票。 此外,尝试坚持使用Eloquent / Laravel / artisan命名约定并命名模型Ticket和其他Category(Eloquent和Laravel将在需要时解析复数,即表名)。

答案 2 :(得分:1)

这些只有一个区别。两者都返回单个关联对象,但有一个区别。当我们将某些关系声明为 belongsTo 时,这意味着有一个数据库表具有某个其他表的外键。当我们声明 hasOne 关系时,表示此表的主键已在另一个表中引用。将其视为父子表。当我们制作子表时,我们将每个孩子引用给它的父母,对吗?这是 belongsTo 。当我们创建父表时,我们知道父表中的每个条目在子表中都可以有一个或多个条目。那是 hasOne hasMany 的关系。如果您需要进一步澄清,可以进一步询问。

答案 3 :(得分:1)

hasOne是1:1或一对一的关系。

hasMany是1:n或一对多的关系。

Eloquent中的belongsTo方法用来定义这些关系的逆

这些的定义取决于您的数据模型。

在你的情况下:

您有一个Category模型,hasMany Ticket s。

您还拥有User模型,hasMany Ticket s。

现在从Ticket角度来看,您需要定义这两个hasMany关系的反转。您将通过定义belongsTo

来完成此操作

故障单belongsTo一个UserbelongsTo一个Category

回答你的问题:

Ticket的角度来看, 是1:1的关系,因为Ticket模型中的外键指向1 User,类别外键指向1 Category。

但是,由于您创建的关系是1:n(一对多),您还在用户和类别模型上定义了它,您应该在Ticket模型中定义关系作为这些关系的,并且hasMany(和hasOne)的倒数是belongsTo

在Laravel中定义关系时,请记住数据库架构,并以与数据库架构中存在的关系相同的方式定义关系。