我所要做的就是了解我到底应该在什么时候使用 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()
?
4条答案
按热度按时间velaa5lx1#
hasOne
是一对一的关系。hasMany
是1:n,或一对多关系。这个
belongsTo
在雄辩的方法是用来定义这些关系的逆。这些的定义将取决于您的数据模型。
就你而言:
你有一个
Category
模型,哪个hasMany
Ticket
s。你也有一个
User
模型,哪个hasMany
Ticket
s。现在从票证的Angular 来看,你需要定义这2个的倒数
hasMany
关系。您将通过定义belongsTo
.所以这张票
belongsTo
一User
以及belongsTo
一Category
.回答您的问题:
从
Ticket
从用户的Angular 看,这是一个1:1的关系,因为票证模型中的外键指向1个用户,类别外键指向1个类别。但是,由于您创建的关系是1:n(一对多),并且您也在用户和类别模型上定义了它,因此您应该将票据模型中的关系定义为这些关系的逆关系,而hasmany(和hasone)的逆关系是
belongsTo
.在laravel中定义关系时,请记住数据库模式,并以与数据库模式中存在的关系相同的方式定义关系。
hof1towb2#
这些都是相同的,只有一点不同。两者都返回一个具有一个差异的关联对象。当我们将某个关系声明为bellongsto时,意味着存在一个数据库表,该表具有其他表的外键。当我们声明hasone关系时,意味着这个表的主键已经在另一个表中被引用了。将其视为父子表。当我们制作子表时,我们将每个子表引用到其父表,对吗?这是属于你的。当我们制作父表时,我们知道父表中的每个条目在子表中可以有一个或多个条目。那是一种或多种关系。如果你需要更多的澄清,你可以进一步询问。
ssgvzors3#
无论如何,我应该在什么时候使用hasone()或belongsto()?
把它想象成
hasMany
如果未来可能存在一对多关系。例如:考虑用户和手机型号。关系的本质是用户hasOne
手机,但如果你想扩展它的功能,以便用户可以有多个电话号码注册用户仍然会有has*
而电话会保持联系belongsTo
关系。只需考虑哪一个可以是“父”实体,哪一个应该有hasOne
方法中的关系。我总是认为用户是父实体,对我来说逻辑上是用户只有一张票。另外,试着坚持雄辩的/laravel/artisan命名约定并命名该模型Ticket
另一个呢Category
(eloquent和laravel将在需要时解决复数,即表名)。jk9hmnmh4#
当处理一对多的关系时,你会有一个
hasMany()
和一个belongsTo()
.我使用的经验法则是,如果一个表有外键(tickets表有外键)
user_id
fk)那么这个模型belongsTo
用户。与类别相同。所以你上面的例子,
Ticket
belongsToUser
&Category
.反过来说,
User
hasManyTicket
同样地Category
hasManyTicket