在Phalcon中获取相关的用户属性

时间:2014-07-12 14:34:59

标签: php phalcon

我是Phalcon的新手,只是试图编写我的第一个应用程序,并面临文档不是很清楚的问题,这与获取相关信息有关。

目前我有1个控制器,用户控制器。

<?php

class UserController extends Phalcon\Mvc\Controller
{

    public function homeAction()
    {

        $users = Users::query()
            ->where('id = :id:')
            ->bind(array('id' => '1'))
            ->execute();

        $user = $users->getFirst();

        $this->view->setVar('user', $users->getFirst());

        $primaryStatus = Status::query()
            ->where('userId = :id:')
            ->bind(array('id' => '1'))
            ->execute();

        $this->view->setVar('primaryStatus', $primaryStatus->getFirst());

        $status = Status::query()
            ->where('userId != :id:')
            ->bind(array('id' => '1'))
            ->execute();

        $this->view->setVar('status', $status);

    }

}

我有一些模型设置,用户,属性和用户属性

我的视图设置为伏特。

这是我的属性模型

<?php

class Attributes extends Phalcon\Mvc\Model
{

    public $id;

    public $name;

    public function initialize()
    {

        $this->hasMany('id', 'UsersAttributes', 'attributesId');

    }

}

我的用户模型

<?php

/**
 * Users class
 *
 * Represents Holla users
 *
 */
class Users extends Phalcon\Mvc\Model
{

    public $id;

    public $name;

    public $username;

    public $password;

    public $email;

    public $active;

    public $createdDate;

    public function getSource()
    {

        return 'users';

    }

    public function initialize()
    {

        $this->hasMany('id', 'UsersAttributes', 'userId');
        $this->hasManyToMany(
            'id',
            'UsersAttributes',
            'userId', 'attributeId',
            'Attributes',
            'id'
        );

    }


}

和我的UsersAttributes模型

<?php

/**
 * Users attributes class
 *
 * Represents Holla users attributes
 *
 * @Source('usersAttributes');
 *
 */
class UsersAttributes extends Phalcon\Mvc\Model
{

    public $id;

    public $userId;

    public $attributeId;

    public $attributeValue;

    public function getSource()
    {

        return 'usersAttributes';

    }

    public function initialize()
    {

        $this->belongsTo('userId', 'Users', 'id');
        $this->belongsTo('attributeId', 'Attributes', 'id');

    }

}

我有3张桌子

用户

  • id例如1
  • 名称,例如安德烈
  • 用户名,例如andrefigueira

属性

  • id例如1
  • attributeName例如profileImage
  • attributeDefaultValue,例如placeholder.jpg

usersAttributes

  • id例如1
  • userId例如1
  • attributeId例如1
  • attributeValue,例如andre.jpg

在我的控制器中,我正在进行查询并将第一个结果分配给一个视图属性,即用户属性,但我无法弄清楚如何从get相关方法实现中访问特定的用户属性。

我希望能够在伏特中执行以下操作:

属性名称在属性表中定义,然后在usersAttributes表中分配值和用户。

{{user.userAttributes.profileImage}}

我将如何完成此任务?我搜索了很多不同的帖子和文档,运气不佳......

提前致谢

2 个答案:

答案 0 :(得分:1)

一对多关系返回零个或多个记录的容器:

{% for r in user.userAttributes %}
    {{ r.profileImage }}
{% endfor %}

答案 1 :(得分:1)

我已经意识到我的错误,一切正常,Phalcon只是以这种方式映射我的结​​构数据库,因为我在属性表中定义了一个属性名称,但用户定义的值是usersAttributes表。因此无法通过标准方式映射它,因此我必须创建一个新方法并在其他地方将其实例化以将参数传递给我的视图。

我用来解决问题的代码在Users模型中,只是将属性作为对象附加到用户结果对象。

public static function fetchUserAttributes($userId)
{

    $modelsManager = Phalcon\DI::getDefault()->getModelsManager();

    $phql = '
    SELECT name, attributeValue
    FROM Attributes
    LEFT JOIN UsersAttributes
    ON UsersAttributes.userId = :userId:
    AND Attributes.id = UsersAttributes.attributeId
    ';

    $rows = $modelsManager->executeQuery($phql, array('userId' => $userId));

    $attributesObj = new \stdClass();

    foreach($rows as $row)
    {

        $attributesObj->{$row['name']} = $row['attributeValue'];

    }

    return $attributesObj;

}

public function afterFetch()
{

    //Attach user attributes
    $this->attributes = Users::fetchUserAttributes($this->id);

}