Странное красноречивое поведение: Попытка получить свойство 'имя' не-объекта, пока объект существует - PullRequest
0 голосов
/ 05 октября 2019

У меня есть эта функция, которая возвращает значение в БД:

public function getMetaValue($key)

Затем я создал функцию для чтения данных в БД на основе getMetaValue:

public function getFeatureByMeta($estate, $type)
{
    $metaId  = (int) $estate->getMetaValue($type);
    $feature = Feature::where('id', $metaId)->first();
    return $feature->name;
}

Если я сейчас вернусь:

$this->getFeatureByMeta($estate, 'stato_immobile')

Выдает

Пытается получить свойство 'name' не-объекта.

Покаесли я выкидываю ту же самую вещь, она выдает правильный результат:

dd($this->getFeatureByMeta($estate, 'stato_immobile')); 
//Returns "Nuovo / In costruzione" which is the DB data `name` I need

Если я возьму функцию getFeatureByMeta и вместо Feature::where('id', $metaId) я жестко закодирую значение идентификатора, вышеупомянутая ошибка не отобразитсяи я получаю правильное название предмета:

public function getFeatureByMeta($estate, $type)
{
    $feature = Feature::where('id', 54)->first();
    return $feature->name;
}

И

public function getFeatureByMeta($estate, $type)
{
    $metaId  = (int) $estate->getMetaValue($type);
    dd($metaId); //Returns 54
}

Если я dd($feature), я получаю строку, о которой говорю:

App\Feature^ {#904
  //...
  #attributes: array:5 [
    "id" => 57
    "name" => "Da ristrutturare"
    "category" => "stato_immobile"
    "created_at" => "2019-09-16 12:15:13"
    "updated_at" => "2019-09-16 12:15:13"
  ]
  #original: array:5 [
    "id" => 57
    "name" => "Da ristrutturare"
    "category" => "stato_immobile"
    "created_at" => "2019-09-16 12:15:13"
    "updated_at" => "2019-09-16 12:15:13"
  ]
  #changes: []
  //...
}

Что может быть причиной этого?

Я сделал видео, чтобы сделать его более понятным: https://streamable.com/5nsq4

1 Ответ

0 голосов
/ 05 октября 2019

По какой-то причине я до сих пор не понимаю, единственное решение, которое я нашел, это:

public function getFeatureByMeta($estate, $type)
{
    $feature = Feature::find($estate->getMetaValue($type));
    if ($feature) {
        return $feature->name;
    }
}

Использование if возвращает правильный атрибут имени. Если вы знаете почему, пожалуйста, прокомментируйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...