Phalcon-Lazy加载在模型中不起作用,原因很奇怪


Phalcon - Lazy loading is not working in Models for some strange reason

我是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: 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"的数据库;

这就是我修复所做的一切