我所要做的就是了解我应该何时使用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()
?
答案 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
一个User
和belongsTo
一个Category
。
回答你的问题:
从Ticket
的角度来看, 是1:1的关系,因为Ticket模型中的外键指向1 User,类别外键指向1 Category。
但是,由于您创建的关系是1:n(一对多)和,您还在用户和类别模型上定义了它,您应该在Ticket模型中定义关系作为这些关系的逆,并且hasMany(和hasOne)的倒数是belongsTo
。
在Laravel中定义关系时,请记住数据库架构,并以与数据库架构中存在的关系相同的方式定义关系。