遍历关系时出现“未定义的偏移量 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”的主要内容,如果未能解决你的问题,请参考以下文章

数组的问题:注意:未定义的偏移量:0

如何解决这个未定义的偏移量:0 错误?

当我尝试使用 Laravel 中的“别名”从数据库中获取值时如何修复“未定义的偏移量:0”

运行代码时出现用户定义类型未定义错误

使用通用登录视图时出现“名称'django'未定义”错误?

安装 VueJS 时出现“无法读取未定义的属性 'mergeConfig'”错误