[英]Understanding hasOne() and belongsTo() functions in Laravel
我所要做的就是了解我应该何时使用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()
函数来做同样的事情。 我应该将它们放入user
和category
模型中。 无论如何,我什么时候应该使用hasOne()
或belongsTo()
?
处理1对多关系时,您将拥有hasMany()
和belongsTo()
。
我使用的经验法则是,如果一个表有一个外键(票证表有一个user_id
fk),那么这个模型belongsTo
用户。 与分类相同。
所以上面的例子, Ticket
belongsTo
User
和Category
。
相反, User
hasMany
Ticket
和类似的Category
hasMany
Ticket
无论如何,我什么时候应该使用hasOne()或belongsTo()?
认为它像什么是hasMany
如果有一对多的关系在未来可能的。 例如:考虑用户和手机型号。 关系的性质将是User hasOne
Phone,但如果您想扩展其功能,那么用户可以注册多个电话号码用户仍然has*
关系,而Phone将保持belongsTo
关系。 只考虑哪一个可以是“父”实体,并且一个应该在方法中具有hasOne
关系。 我总是将User视为父实体,对我来说逻辑上是用户有一张票。 此外,尝试坚持使用Eloquent / Laravel / artisan命名约定并命名模型Ticket
和其他一个Category
(Eloquent和Laravel将在需要时解析复数,即表名)。
这些是相同的,只有一个区别。 两者都返回单个关联对象,但有一个区别。 当我们将某个关系声明为belongsTo时,它意味着有一个数据库表,其中包含某个其他表的外键。 当我们声明hasOne关系时,它意味着该表的主键已在另一个表中引用。 将其视为父子表。 当我们制作子表时,我们将每个孩子引用给它的父母,对吗? 这是属于 。 当我们创建父表时,我们知道父表中的每个条目在子表中都可以有一个或多个条目。 这是hasOne或的hasMany关系。 如果您需要进一步澄清,可以进一步询问。
hasOne
是1:1或一对一的关系。
hasMany
是1:n或一对多关系。
belongsTo
中的belongsTo
方法用于定义这些关系的反转 。
这些的定义取决于您的数据模型。
在你的情况下:
你有一个Category
模型,它有许多hasMany
Ticket
。
您还有一个User
模型,其中包含许多hasMany
Ticket
。
现在从Ticket角度来看,您需要定义这两个hasMany
关系的反转。 您将通过定义belongsTo
来完成此belongsTo
。
因此Ticket belongsTo
一个User
并且belongsTo
一个Category
。
回答你的问题:
从Ticket
的角度来看,它是一个1:1的关系,因为Ticket模型中的外键指向1 User,类别外键指向1 Category。
但是,由于您所创建的关系是1:N(一到多),你还定义它的用户和类别车型,你应该定义在您的机票模型这些关系的逆的关系,以及逆一个hasMany(和hasOne)是belongsTo
。
在Laravel中定义关系时,请记住数据库模式,并以与数据库模式中存在的关系相同的方式定义关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.