При переопределении модели Laravel Eloquent в методе доступа возвращается 0 при использовании свойства - PullRequest
0 голосов
/ 19 сентября 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Хорошо, поэтому я использовал следующий метод:

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 голосов
/ 19 сентября 2018

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

(!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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...