Извините за (возможно) несколько неясные вопросы. Я не знал, как это выразить по-другому. (предложения приветствуются: р) Код, однако, говорит сам за себя, я думаю:
Я использую метод доступа, чтобы получить тему страницы (или от ее родителя, если у нее нет установленной темы) как таковой:
public function getThemeAttribute()
{
if(!isset($this->theme_uid) || $this->theme_uid === null || $this->theme_uid === '')
{
return $this->parent->theme()->first();
}
//return $this->theme->first();
return self::theme()->first();
}
Это работает, если я запрашиваю свойство темы, например:
$page->theme
Который возвращает:
Theme {#741 ▼ ...etcetera
Но если я попытаюсь получить доступ к свойству возвращаемой модели, например:
$page->theme->uid
Я получил:
0
Наверное, как-то связано с тем, что происходит под капотом, но пока не понял, так что любая помощь будет отличной.
Уже спасибо!
С уважением Gijs
Итак, небольшое улучшение кода:
(!isset($this->theme_uid) || $this->theme_uid === null) === !isset($this->theme_uid)
isset — определяет, установлена ли переменная и не равна ли NULL
Теперь эта часть:
return $this->theme->first();
Приведет к магическому методу __get
рекурсия и исключение.
https://bugs.php.net/bug.php?id=71254
В твоем случае, theme
это отношения, а не атрибут. Я думаю 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
не волнуясь, если это на родителя или какой тип (Relation
, Model
и т. д.) возвращаемое значение по теме.
Если кто-то может сказать мне, почему это не возможно напрямую, я все еще очень заинтересован, и любой, кто помог здесь: Спасибо!