Laravel是否具有一对一或一对一的雄辩关系?

时间:2017-10-21 17:31:22

标签: php mysql laravel-5

是否可以将Laravels HasOne关系用作HasOneOrZero关系?

示例:docs中,在用户和电话之间描述了HasOne关系。如果每个用户都有 0 1 手机,是否可以使用此操作?或者我是否需要OneToMany relation以允许 0

如果我将HasOne关系用作 HasOneOrZero 关系,我不确定它是否会导致任何问题。

2 个答案:

答案 0 :(得分:4)

不,HasOne关系可以是null,它不需要在数据库中有关系行。只要你拿到它就检查一下。

此外,您可能需要并喜欢新的5.5 optional功能。

它的工作原理如下:

optional($user->phone)->number;

如果您有电话,则会返回号码,但如果不是,则会null而不是Trying to get property of non-object

答案 1 :(得分:1)

除了astratyandmitry之外,在我问自己HasOneHasMany之间究竟有什么区别之后,我想补充一下我发现的以下内容。

首先,它们都具有相同的表结构。

用户表

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个函数中有所不同:

  • getResults()
  • initRelation()
  • 匹配()

只要调用无括号的关系(参见here),就会通过神奇的getResults()方法调用__get()方法

$user->phone

以下是类getResults()的{​​{1}}方法:

hasOne

因此输出将是

enter image description here

如果关系声明为public function getResults() { return $this->query->first() ?: $this->getDefaultFor($this->parent); }

hasOne

相比之下,类public function phone() { return $this->hasOne('App\Phone'); } 中的getResults()方法由:

给出
hasMany

因此输出是一个空集合:

enter image description here

如果关系声明为public function getResults() { return $this->query->get(); }

hasMany

因此,如果数据库中没有关系行,public function phone() { return $this->hasMany('App\Phone'); } 关系将返回HasOne,并且可以将其作为astratyandmitry在其帖子中描述。

不幸的是,我无法找到调用方法null或方法initRelation()的时间。