Как получить значение атрибута в качестве экземпляра модели в PHP ActiveRecord?

Я пытаюсь достичь чего-то, что должно быть простым, но кажется невозможным в PHP ActiveRecord.

В упрощенном примере, который я создал, у меня есть две модели, Person и Exchange, и две таблицы, people(id, name) а также exchange(id, user_from_id, user_to_id, comment), exchange.user_from_id а также exchange.user_to_id иметь ссылку на ограничение внешнего ключа people.id,

Поэтому, когда я запускаю следующий код:

$exchange = Exchange::first();
echo $exchange->user_from_id;
echo $exchange->user_from_id->name;

Я бы ожидал первого echo потерпеть неудачу и второй, чтобы преуспеть. Вместо этого первый преуспевает и печатает буквальное значение exchange.user_from_id и затем, очевидно, второй генерирует предупреждение «Попытка получить свойство необъекта».

Результат одинаков как с добавлением, так и без добавления в Exchange:

static $belongs_to = array(
array('user_from_id', 'class_name' => 'Person'),
array('user_to_id', 'class_name' => 'Person')
);

Что я должен изменить в своем коде, чтобы сделать так, чтобы $exchange->user_from_id возвращает экземпляр класса Person?

1

Решение

Оказывается, я неправильно понял, как работает. Я думал, что это каким-то образом связывает свойство Модели, соответствующее атрибуту, с другой Моделью, но теперь я понимаю, что оно создает новое свойство, которое затем необходимо явно связать с атрибутом, используя foreign_key вариант.

Конкретно, это то, что я должен был добавить в Exchange:

static $belongs_to = array(
array('user_from',
'class_name' => 'Person',
'foreign_key' => 'user_from_id'),
array('user_to',
'class_name' => 'Person',
'foreign_key' => 'user_to_id')
);

Затем, используя этот код:

$exchange = Exchange::first();
echo $exchange->user_from;
echo $exchange->user_from->name;

Я наконец получил то, что ожидал: фатальная ошибка на первом echo а второй печатает people.name где people.id = exchange.user_from_id,

Это также позволило использовать энергичную загрузку двух people объекты с:

$exchange = Exchange::first(array('include' => array('user_from', 'user_to')));
1

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

Других решений пока нет …

По вопросам рекламы [email protected]