Я новичок в phalcon и больше знаком с Symfony, мне просто нужно знать, как определить необязательные отношения между внешними ключами в моделях phalcon.
т.е.
Таблица пользователей PK — это user_id, и пользователи могут иметь (необязательно) связанную запись в таблице Photos, чтобы иметь фотографию с первичным ключом photo_id и связать ее с user_id.
Поэтому в моих моделях сокола мне нужно загружать пользователей фотографиями, если они есть.
В модели пользователя
public function initialize()
{
$this->hasMany(
"photo_id",
"Photo",
"photo_id",
array(
'alias' => 'photos'
)
);
}
На фотомодели я пишу это как
public function initialize()
{
$this->belongTo(
"user_id",
"User",
"user_id",
array(
'alias' => 'user'
)
);
}
Вольт, чтобы получить доступ к нему через
{{user.photo.photo_id}}
Но это дает мне ошибку
Undefined property: Phalcon\Mvc\Model\Resultset\Simple::$photo_id
Любая идея ?
Странно, если сделать этот код в контроллере, он работает и получить мне модели фотографий, но не тогда, когда я пытаюсь получить к нему доступ с ленивой загрузкой /
$users = User::find(array(
"limit" => 10)
);
echo "There are ", count($users), "\n";
foreach($users as $user){
$photos = Photo::find(array(
"user_id=:user_id:",
"limit" => 10,
"bind" => array("user_id" => $user->user_id)
)
);
if($photos->count()==0){
echo "<br />";
echo "No photo found for user".$user->user_id;
}
foreach($photos as $photo){
echo '<br />';
echo "User ->".$photo->user_id." Photo -> ".$photo->photo_id;
}
}
Когда я пытаюсь сделать это с ленивой загрузкой, как это
foreach($users as $user){
//echo $user->photos->photo_id;
foreach($user->photos as $photo){
echo '<br />';
echo "User ->".$photo->user_id." Photo -> ".$photo->photo_id;
}
}
Я получаю ошибку:
Неопределенное свойство: Phalcon \ Mvc \ Model \ Resultset \ Simple :: $ photo_id
Когда используешь $this->hasMany()
Отношение вы должны перебрать все записи:
{% for userPhoto in user.photo %}
{{ userPhoto.photo_id }}
{% else %}
User has no photos
{% endfor %}
Также проверьте названия моделей (они должны совпадать с именами классов моделей):
$this->hasMany(
"users_id",
"Photos",
"photo_id",
array(
"alias" => "photo")
);
Также добавление единственного псевдонима для hasMany
может быть запутанным (предыдущая версия ответа предполагала отношение один к одному), поэтому я бы назвал этот псевдоним "photos"
не "photo"
,
С другой стороны, если User
может иметь только один Photo
затем используйте $this->hasOne()
,
Пример:
$this->hasOne(
'photo_id',
'Photos',
'id',
array('alias' => 'photo')
);
Структура базы данных:
Users: id, photo_id // other like name, email
Photos: id // other, like url, type, etc
Тогда вы могли бы использовать $this->photo->photo_id
когда есть связанные данные в базе данных.
Самое простое решение тогда будет:
{% if user.photo %}{{ user.photo.photo_id }}{% endif %}
Во-вторых, ошибка: при использовании hasMany
Отношение Phalcon дает вам результат поиска нескольких связанных объектов (так что это Phalcon\Mvc\Model\Resultset\Simple
который по умолчанию возвращает «поиск нескольких объектов», как Model::find()
).
Кажется, проблема вызвана тем, что у меня есть два подключения к базе данных, как показано ниже, что вызывает некоторые проблемы в наборе DI.
return new \Phalcon\Config(array(
'database' => array(
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'db_main',
'name' => 'db_main',
),
необходимо хранить только одну базу данных с именем «dbname»;
это все, что я сделал, чтобы исправить