Как использовать выбранные столбцы в модели phalcon с отношениями

У меня есть модель с именем User и UserPhoto, которая связана у одного пользователя со многими фотографиями пользователя.

$this->hasMany("id", "UserPhoto", "user_id");
$this->belongsTo("user_id", "User", "id");

Если я попытаюсь

$userData = User::find();

foreach ($userData as $user) {
    $userPhotoAry = $user->UserPhoto;
}

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

Итак, я попробовал это,

$userData = User::find(array("columns"=>"id,username"));

foreach ($userData as $user) {
    $userPhotoAry = $user->UserPhoto;
}

Я получаю $UserPhoto не определено.

Есть ли способ упомянуть столбец в запросе поиска вместе с отношениями?


person pab.ror    schedule 24.03.2017    source источник
comment
Как сказал @nikolay, невозможно получить связанные записи, если вы укажете столбцы в своем запросе. Потому что вам будет возвращен Phalcon\Mvc\Model\Row вместо экземпляра модели. Могу ли я добавить, что указание столбцов на самом деле медленнее, чем просто запрос всей записи   -  person Timothy    schedule 24.03.2017


Ответы (3)


С поведением по умолчанию вы не можете. Вот почему:

// Specifying columns
$userData = User::find(array("columns"=>"id,username"));
var_dump(get_class($userData[0])); // "Phalcon\Mvc\Model\Row"

// Selecting whole objects
$userData = User::find();
var_dump(get_class($userData[0])); // "Users"

Как вы можете видеть выше, указание столбцов возвращает не экземпляры Model, а экземпляры Row, которые не имеют методов/отношений, как вы уже видели сами.

Есть способ добиться этого, но он требует дополнительных усилий, и я не уверен, что он того стоит. Вы можете прочитать больше в этой теме форума и перейдите по предоставленным ссылкам.

person Nikolay Mihaylov    schedule 24.03.2017
comment
Я могу понять, что вы объяснили, но мне нужно что-то, что может обрабатывать как объект Users, так и выбор столбца из таблицы. - person pab.ror; 24.03.2017

Насколько я знаю, это невозможно. Связь имеет все столбцы. Почему нет ?

или вот так:

$userData = User::query()
->columns(["User.id", "User.username"])
->innerJoin("UserPhoto")
->execute();
person Анатолий Астапов    schedule 10.04.2017

Вы можете отключить столбцы, которые вы не хотите использовать внутри foreach

person Jelly    schedule 04.05.2020