Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在访问器中重写Laravel Eloquent模型在使用属性时返回0_Php_Laravel_Inheritance_Eloquent_Accessor - Fatal编程技术网

Php 在访问器中重写Laravel Eloquent模型在使用属性时返回0

Php 在访问器中重写Laravel Eloquent模型在使用属性时返回0,php,laravel,inheritance,eloquent,accessor,Php,Laravel,Inheritance,Eloquent,Accessor,抱歉(可能)有点不清楚的问题。我不知道如何用其他方式来表达。(建议是受欢迎的:p)然而,准则本身就说明了问题,我认为: 我使用访问器获取页面的主题(如果没有主题集,则从其父级获取): 如果我正在请求主题属性本身,则此选项有效,例如: $page->theme 返回: Theme {#741 ▼ ...etcetera 但是如果我尝试访问返回模型上的属性,例如: $page->theme->uid 我得到: 0 可能与引擎盖下发生的事情有关,但还没有弄清楚,所以任何帮助都

抱歉(可能)有点不清楚的问题。我不知道如何用其他方式来表达。(建议是受欢迎的:p)然而,准则本身就说明了问题,我认为:

我使用访问器获取页面的主题(如果没有主题集,则从其父级获取):

如果我正在请求主题属性本身,则此选项有效,例如:

$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();
}