遍历关系时出现“未定义的偏移量 0”
Posted
技术标签:
【中文标题】遍历关系时出现“未定义的偏移量 0”【英文标题】:"Undefined offset 0" when traversing relationship 【发布时间】:2017-09-15 06:37:00 【问题描述】:我的系统中有两个模型,Patent 和 PatentApplicant。 PatentApplicant 迁移定义了外键:
$table->integer('patent_id')->unsigned();
$table->foreign('patent_id')->references('id')->on('patents');
在我的专利模型上,关系是这样定义的:
public function applicant()
return $this->belongsTo('App\Models\Patents\PatentApplicant')->get()[0];
关键是申请人也可以为空。因此,当我尝试使用 $patent->applicant()
(目前不存在)访问申请人时,我收到此错误:
php error: Undefined offset: 0 in /path/to/some/cache/compiled.php
我知道这是产生错误的行,因为我处于tinker
模式并发出了$patent->applicant()
。我不是 Laravel 专家,可能在某处做错了什么。
请帮忙!
【问题讨论】:
不要使用[0]
。 belongsTo
不需要数组访问器来定义关系。事实上,没有任何关系可以。
你不能像@Ohgodwhy 提到的那样使用有关系的元素
@Ohgodwhy 那么问题是我必须在某个地方处理数组。就我而言,一项专利只能有一个申请人。对此建模的正确方法是什么?
我想我需要使用hasOne()
而不是belongsTo()
?
把get()[0]
改成first()
不是更好吗?当没有记录时,它总是返回一个或 null / false。
【参考方案1】:
在一对一关系中,引用所有者表(在您的情况下为专利)的拥有表(此处为专利申请表)中必须有一个外键。因此您的专利模型应该具有如下关系:
public function applicant()
return $this->hasOne('App\Models\Patents\PatentApplicant');
假设命名空间App\Models\Patents\
是真正定制的,没有写错。
并且不需要[0]
或first()
甚至get()
。关注this part of the doc.s
【讨论】:
请查看我对问题的最终评论并回复? :-) @dotslash $model->relation() 返回关系对象但 $model->relation 返回关系的结果 - 详情请查看此问题***.com/questions/28223289/… 最有帮助!谢谢。 ^.^【参考方案2】:您可以使用->first()
,也可以在第一次离开现场之前检查是否有来自get
的结果
【讨论】:
【参考方案3】:您必须删除 get() 末尾的 [0]。如果你想要单个记录数组,那么它对 user first() 而不是 get 更好。
【讨论】:
以上是关于遍历关系时出现“未定义的偏移量 0”的主要内容,如果未能解决你的问题,请参考以下文章