Php 在访问器中重写Laravel Eloquent模型在使用属性时返回0
抱歉(可能)有点不清楚的问题。我不知道如何用其他方式来表达。(建议是受欢迎的:p)然而,准则本身就说明了问题,我认为: 我使用访问器获取页面的主题(如果没有主题集,则从其父级获取): 如果我正在请求主题属性本身,则此选项有效,例如:Php 在访问器中重写Laravel Eloquent模型在使用属性时返回0,php,laravel,inheritance,eloquent,accessor,Php,Laravel,Inheritance,Eloquent,Accessor,抱歉(可能)有点不清楚的问题。我不知道如何用其他方式来表达。(建议是受欢迎的:p)然而,准则本身就说明了问题,我认为: 我使用访问器获取页面的主题(如果没有主题集,则从其父级获取): 如果我正在请求主题属性本身,则此选项有效,例如: $page->theme 返回: Theme {#741 ▼ ...etcetera 但是如果我尝试访问返回模型上的属性,例如: $page->theme->uid 我得到: 0 可能与引擎盖下发生的事情有关,但还没有弄清楚,所以任何帮助都
$page->theme
返回:
Theme {#741 ▼ ...etcetera
但是如果我尝试访问返回模型上的属性,例如:
$page->theme->uid
我得到:
0
可能与引擎盖下发生的事情有关,但还没有弄清楚,所以任何帮助都会很好
已经谢谢你了
将Gijs看作是一个小的代码改进:
(!isset($this->theme_uid) || $this->theme_uid === null) === !isset($this->theme_uid)
isset-确定变量是否已设置且不为空
现在这一部分:
return $this->theme->first();
将导致magic方法\uu get
递归并引发异常。
在您的例子中,主题
是一种关系,而不是属性。我认为attribute
访问器应该用于其预期目的-attribute
访问。您可以通过自定义关系表达您的情况:
public function availableTheme()
{
if(!empty($this->theme_uid))
{
return $this->theme();
}
return $this->parent->theme();
}
// $page->availableTheme
// $page->avalaibleTheme()->where(...)->first()
好的,我采用的方法如下:
public function getThemeAttribute()
{
if(!isset($this->theme_uid) || $this->theme_uid === null || $this->theme_uid === '')
{
return (object)$this->parent->theme()->first()->getAttributes();
}
return (object)self::theme()->first()->getAttributes();
}
这允许我有一个很好的语法,在这里我需要访问值(例如:$page->theme->uid
或$page->theme->color
),而不必担心主题上返回的值是否在父项上,或者是什么类型(关系
,模型
,等等)
如果有人能告诉我为什么不能直接实现这一点,我仍然很感兴趣,任何在此提供帮助的人:谢谢!如果我正确理解了您的代码,它应该会以一个循环结束,因为您正在使用getThemeAttribute,但在同一个函数中使用$this->主题,这两个函数都引用了相同的函数。@Gijs Beijer我发布了一些ide同样,对于uuid为什么会得到
0
,你能做这个测试吗?dd($theme->getAttributes());
I@milo526你在我复制试用代码的地方,我实际上使用了self::theme()为了克服这个问题,它确实返回了正确的主题模型实例,但我无法调用任何属性。@Andrius Rimkus调用:->getAttributes()
确实会显示值。如果您在原始属性数组中看到uuid
,那么问题可能与uuid
accessor.hi your availableTheme()有关方法确实有效,但它在视图中给我留下了一个丑陋的语法,我真的希望它对团队的其他成员来说是直观的。我将使用我现在使用的方法编辑我的问题(合并->getAttributes()
正如@Andrius Rimkus所建议的,命名由你决定。我只是想解决我的关系访问者的问题。
public function getThemeAttribute()
{
if(!isset($this->theme_uid) || $this->theme_uid === null || $this->theme_uid === '')
{
return (object)$this->parent->theme()->first()->getAttributes();
}
return (object)self::theme()->first()->getAttributes();
}