HasOne 显示“null”或“未定义属性:Illuminate\\Database\\Eloquent\\Relations\\HasOne”
Posted
技术标签:
【中文标题】HasOne 显示“null”或“未定义属性:Illuminate\\\\Database\\\\Eloquent\\\\Relations\\\\HasOne”【英文标题】:HasOne showing either "null" or "Undefined property: Illuminate\\Database\\Eloquent\\Relations\\HasOne"HasOne 显示“null”或“未定义属性:Illuminate\\Database\\Eloquent\\Relations\\HasOne” 【发布时间】:2021-11-25 12:27:16 【问题描述】:我正在尝试使用 hasOne
在我的数据集中返回单个值,但是如果不返回完整对象,我似乎无法将单个列作为值返回。
当你只返回hasOne
时,返回的对象是什么样子的:
protected $with = ["steps"];
public function steps()
return $this->hasOne("App\Compares\ComparesSteps", "compare_id", "id");
只使用 hasOne 作为默认对象的结果:
array:21 [
"id" => 5887894545
"steps" => array:5 [
"id" => 21
"compare_id" => 588789
"steps" => array:12 [
0 => 1
1 => 2
2 => 3
3 => 4
4 => 13
5 => 6
6 => 7
7 => 17
8 => 8
9 => 9
10 => 10
11 => 12
]
"created_at" => "2021-10-05 08:48:44"
"updated_at" => "2021-10-05 08:48:44"
]
"created_at" => "2021-10-05 08:48:43"
"updated_at" => "2021-10-05 08:48:43"
"expired_at" => "2021-10-09 08:48:43"
"booked" => 0
"reference" => null
"utm" => ""
"updates" => []
]
返回null
:
array:21 [
"id" => 5887894545
"steps" => null
"created_at" => "2021-10-05 08:48:43"
"updated_at" => "2021-10-05 08:48:43"
"expired_at" => "2021-10-09 08:48:43"
"booked" => 0
"reference" => null
"utm" => ""
"updates" => []
]
返回Call to a member function addEagerConstraints() on array
:
public function steps()
return $this->hasOne("App\Compares\ComparesSteps", "compare_id", "id")->value("steps");
返回Undefined property: Illuminate\\Database\\Eloquent\\Relations\\HasOne::$steps
:
public function steps()
return $this->hasOne("App\Compares\ComparesSteps", "compare_id", "id")->steps;
预期结果:
array:21 [
"id" => 5887894545
"steps" => array:12 [
0 => 1
1 => 2
2 => 3
3 => 4
4 => 13
5 => 6
6 => 7
7 => 17
8 => 8
9 => 9
10 => 10
11 => 12
]
"created_at" => "2021-10-05 08:48:43"
"updated_at" => "2021-10-05 08:48:43"
"expired_at" => "2021-10-09 08:48:43"
"booked" => 0
"reference" => null
"utm" => ""
"updates" => []
]
更新基于与@MaartenDev 在 cmets 中的对话
我想在模型被调用时将$model->steps->steps
附加到$model->steps
。由于我正在更新数据库表以将某些数据拆分为表,并希望在调用模型时保持数据结构相同。
例如如果您使用的是 getUserCountAttribute
,您可以通过 hasMany()->Count()
轻松返回数字。
所以我想在调用模型时将steps
数组附加到steps
属性。
【问题讨论】:
试试->steps();
@DimitriMostrey - 这给出了以下Call to undefined relationship
请添加一个您尝试如何访问关系的示例
@MaartenDev 该示例已经存在它在第一个代码块中protected $with = ["steps"];
它在调用我的模型时默认访问关系Steps::where("id", 200")->first();
@MaartenDev 我也试过用getStepsAttribute()
的方法附加属性
【参考方案1】:
是否可以选择使用steps
关系的自定义getter?您可以使用 $appends
预加载值。
class Model
protected $appends = ["steps"];
protected $hidden = ['stepsRelation']
public function getStepsAttribute()
return $this->stepsRelation->steps;
private function stepsRelation()
return $this->hasOne("App\Compares\ComparesSteps", "compare_id", "id");
查看Laravel docs on appends。
【讨论】:
stepsRelation
如何在不被调用的情况下访问getStepsAttribute
,我刚刚尝试过。由于$with = ["stepsRelation"]
,这似乎没有拿起getStepsAttribute
,只调用stepsRelation
。您必须设置 $appends
才能使 getter 方法起作用
您直接调用steps
属性而不是使用关系。当您使用$model->steps
访问步骤时,它是否有效?
我已经让它与以下protected $appends = ['steps'];
一起使用。所以而不是$with
使用$appends
太棒了!我把你的编辑和我的合并了,祝你好运:)
您可以尝试将关系方法设为私有或将其添加到模型中的$hidden = ['stepsRelation']
以上是关于HasOne 显示“null”或“未定义属性:Illuminate\\Database\\Eloquent\\Relations\\HasOne”的主要内容,如果未能解决你的问题,请参考以下文章