Я пытаюсь достичь чего-то, что должно быть простым, но кажется невозможным в 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?
Оказывается, я неправильно понял, как работает. Я думал, что это каким-то образом связывает свойство Модели, соответствующее атрибуту, с другой Моделью, но теперь я понимаю, что оно создает новое свойство, которое затем необходимо явно связать с атрибутом, используя 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')));
Других решений пока нет …