При переопределении модели Laravel Eloquent в методе доступа возвращается 0 при использовании свойства

Извините за (возможно) несколько неясные вопросы. Я не знал, как это выразить по-другому. (предложения приветствуются: р) Код, однако, говорит сам за себя, я думаю:

Я использую метод доступа, чтобы получить тему страницы (или от ее родителя, если у нее нет установленной темы) как таковой:

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

1

Решение

Итак, небольшое улучшение кода:

(!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()
2

Другие решения

Итак, метод, с которым я пошел, заключается в следующем:

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и т. д.) возвращаемое значение по теме.

Если кто-то может сказать мне, почему это не возможно напрямую, я все еще очень заинтересован, и любой, кто помог здесь: Спасибо!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector