首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CakePHP检索数据、关联模型、包含行为

CakePHP检索数据、关联模型、包含行为
EN

Stack Overflow用户
提问于 2013-05-23 10:48:17
回答 1查看 560关注 0票数 0

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

我需要将下面的MySQL查询放在cakephp (‘all’)函数中,我知道我可以使用查询生成器来执行sql语法,但我想使用find函数,并想知道它是如何工作的。

代码语言:javascript
复制
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)。我尝试了以下几种变体:

代码语言:javascript
复制
$data = $this->Event->find('all',array(
            'contain' => array(
                'UserRole' => array(
                    'fields' => array('id'),
                    'conditions' => array(
                        'UserRole.user_id' => $this->Auth->user('id')
                    )
                )
            )
        ));

但这个会把所有的事情都还给你。我想要的是一个类似的数组(或具有相同关联数据的任何其他结果):

代码语言:javascript
复制
array(
    [0] => array(
        [Event] => array(
            'id' => 1,
            'name' => 'Event Name'
        ),
        [UserRole] => array(
            'role_id' => 2,
            'event_id'=> 1
        )
    [1] => array(
        .... etc ...
)

定义了以下模型和关联

代码语言:javascript
复制
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中设置了:

代码语言:javascript
复制
public $recursive = -1;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-23 11:00:24

Containable查找原始查询的关联记录。您所做的是在您的Event模型上使用一个绝对不带任何条件的Event,因此将返回所有事件。

然后Containable将检索所有用于给定user_iduser_id记录,并由event_idEvent相关联。

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

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

代码语言:javascript
复制
$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核心类)

代码语言:javascript
复制
$events = Hash::extract('/UserRole[user_id='.$this->Auth->user('id').']/..', $data);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16711947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档