Phalcon - 由于一些奇怪的原因,懒惰加载在模型中不起作用

时间:2014-10-07 05:49:53

标签: php activerecord phalcon volt

我是phalcon的新手,来自更多Symfony背景,我只需要知道如何在phalcon模型中定义外键之间的可选关系。

即 用户表PK是user_id,用户可以在Photos表中拥有(可选)相关记录,以获得主键photo_id的照片,并通过'user_id'链接。

所以在我的猎鹰模型中,我需要加载带有照片的用户。

在用户模型中

 public function initialize()
{
    $this->hasMany(
        "photo_id",
        "Photo",
        "photo_id",
        array(
            'alias' => 'photos'
        )
    );
}

IN照片模型我把它写成

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

2 个答案:

答案 0 :(得分:1)

使用$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"。< / p>

另一方面,如果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是默认返回&#39;搜索多个对象&#39; like Model::find())。

答案 1 :(得分:0)

问题似乎是由于我有两个数据库连接,如下所示,这导致了DI设置中的一些问题。

return new \Phalcon\Config(array(
    'database'    => array(
        'adapter'  => 'Mysql',
        'host'     => 'localhost',
        'username' => 'root',
        'password' => '',
        'dbname'   => 'db_main',
        'name'   => 'db_main',
    ),

只需要保留一个名为&#34; dbname&#34 ;;

的数据库

这就是我所做的所有修复