是否可以将Laravels HasOne关系用作HasOneOrZero关系?
示例: 在docs中,在用户和电话之间描述了HasOne关系。如果每个用户都有 0 或 1 手机,是否可以使用此操作?或者我是否需要OneToMany relation以允许 0 ?
如果我将HasOne关系用作 HasOneOrZero 关系,我不确定它是否会导致任何问题。
答案 0 :(得分:4)
不,HasOne关系可以是null
,它不需要在数据库中有关系行。只要你拿到它就检查一下。
此外,您可能需要并喜欢新的5.5 optional
功能。
它的工作原理如下:
optional($user->phone)->number;
如果您有电话,则会返回号码,但如果不是,则会null
而不是Trying to get property of non-object
答案 1 :(得分:1)
除了astratyandmitry之外,在我问自己HasOne
和HasMany
之间究竟有什么区别之后,我想补充一下我发现的以下内容。
首先,它们都具有相同的表结构。
用户表:
id | name
1 | Alice
2 | Bob
电话表:
id | user_id | phone
1 | 1 | 123
2 | 2 | 321
类Model
中的方法 hasMany 和 hasOne 是完全相同的,除了它们返回的对象:
public function hasOne($related, $foreignKey = null, $localKey = null)
{
$foreignKey = $foreignKey ?: $this->getForeignKey();
$instance = new $related;
$localKey = $localKey ?: $this->getKeyName();
return new HasOne($instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey);
}
和
public function hasMany($related, $foreignKey = null, $localKey = null)
{
$foreignKey = $foreignKey ?: $this->getForeignKey();
$instance = new $related;
$localKey = $localKey ?: $this->getKeyName();
return new HasMany($instance->newQuery(), $this, $instance->getTable().'.'.$foreignKey, $localKey);
}
但是,返回的对象(类HasOne
和类HasMany
)仅在3个函数中有所不同:
只要调用无括号的关系(参见here),就会通过神奇的getResults()
方法调用__get()
方法
$user->phone
以下是类getResults()
的{{1}}方法:
hasOne
因此输出将是
如果关系声明为public function getResults()
{
return $this->query->first() ?: $this->getDefaultFor($this->parent);
}
hasOne
相比之下,类public function phone()
{
return $this->hasOne('App\Phone');
}
中的getResults()
方法由:
hasMany
因此输出是一个空集合:
如果关系声明为public function getResults()
{
return $this->query->get();
}
hasMany
因此,如果数据库中没有关系行,public function phone()
{
return $this->hasMany('App\Phone');
}
关系将返回HasOne
,并且可以将其作为astratyandmitry在其帖子中描述。
不幸的是,我无法找到调用方法null
或方法initRelation()
的时间。