我是phalcon的新手,来自Symfony背景,我只需要知道如何在phalcon模型中定义外键之间的可选关系。
即Users表PK为user_id,Users在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: PhalconMvcModelResultsetSimple::$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会给你搜索多个相关对象的结果(所以是PhalconMvcModelResultsetSimple
,它是像Model::find()
一样的"搜索多个对象"的默认返回)。
问题似乎是由我有两个数据库连接引起的,如下所示,这在DI集中造成了一些问题。
return new PhalconConfig(array(
'database' => array(
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'db_main',
'name' => 'db_main',
),
只需要保留一个名为"dbname"的数据库;
这就是我修复所做的一切