【问题标题】:CakePHP retrieve data, associate models, containable behaviorCakePHP 检索数据、关联模型、可包含行为
【发布时间】:2013-05-23 10:48:17
【问题描述】:

我似乎无法弄清楚可包含行为是如何工作的,或者如何从(并基于)相关模型检索数据。

我需要将以下 MySQL 查询放入 cakephp find('all') 函数中,我知道我可以将查询生成器用于 sql 语法,但我想使用 find 函数并想弄清楚它是如何工作的。

SELECT events.id, events.name FROM events, user_roles
WHERE user_roles.event_id = events.id
AND user_roles.user_id = 1

这个想法很简单,在 user_roles 中存储了 user_id、role_id 和 event_id。现在我想检索某个用户的所有事件(这里 user_id = 1)。我尝试了以下一些变化:

$data = $this->Event->find('all',array(
            'contain' => array(
                'UserRole' => array(
                    'fields' => array('id'),
                    'conditions' => array(
                        'UserRole.user_id' => $this->Auth->user('id')
                    )
                )
            )
        ));

但这会不断返回所有事件。我想要的是一个数组(或具有相同关联数据的任何其他结果):

array(
    [0] => array(
        [Event] => array(
            'id' => 1,
            'name' => 'Event Name'
        ),
        [UserRole] => array(
            'role_id' => 2,
            'event_id'=> 1
        )
    [1] => array(
        .... etc ...
)

定义了以下模型和关联

class Event extends AppModel {
    public $hasMany = array(
        'UserRole' => array(
            'className' => 'UserRole',
            'foreignKey' => 'event_id',
            'dependent' => false,
        )
    )
)

class UserRole extends AppModel {
    public $belongsTo = array(
       'Event' => array(
            'className' => 'Event',
            'foreignKey' => 'event_id'
        ),
    )
)

那么它是如何工作的;)。

编辑:

忘了说我在 AppModel.php 中设置了:

public $recursive = -1;

【问题讨论】:

    标签: php cakephp model-associations cakephp-2.3


    【解决方案1】:

    Containable 查找原始查询的关联记录。您正在做的是在您的 Event 模型上创建一个 find('all'),绝对没有条件,因此它返回所有事件。

    然后 Containable 将检索给定 user_id 的所有 UserRole 记录,并通过 event_id 关联到 Event

    如果您只想检索给定用户的事件,您可以通过以下两种方式之一进行操作

    通过 Event->UserRole 关联和链式模型:

    $data = $this->Event->UserRole->find('first', array(
        'conditions' => array('UserRole.user_id' => $this->Auth->user('id'),
        'contain' => array('Event')
    ));
    
    $events = $data['Event'];
    

    通过您当前的代码,然后使用Hash::extract 方法获取匹配的事件。 (Hash 是 CakePHP 的核心类)

    $events = Hash::extract('/UserRole[user_id='.$this->Auth->user('id').']/..', $data);
    

    【讨论】:

    • 谢谢!我在您的第一个解决方案上尝试了一些版本,但得到了著名的 column not found 错误。另一个问题,使用 Event->UserRole 说,如果我正确理解语法,找到与 UserRole 模型关联的事件?
    • 不,Event->UserRole 是一种通过类中设置的关系调用模型方法的方法,而不必先实例化它。它不会对您的结果应用任何特定的过滤,只是让您可以访问该模型的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多