如何使用手动连接复制Cake的深度搜索

时间:2014-01-16 02:17:15

标签: php sql cakephp cakephp-2.0 cakephp-2.4

我有以下代码:

$current_user = $this->User->find('first', array(
    'recursive' => -1,
    'conditions' => array('User.id' => $user_id),
    'fields' => array(
        //User
        'User.id',
        //Profile
        'Profile.user_id',
        'Profile.id',
        'Profile.first_name',
        'Profile.last_name',
        'Profile.media_asset_id',
        //Profile Picture
        'MediaAsset.id'
    ),
    'joins' => array(
        array(
            'table' => 'profiles',
            'alias' => 'Profile',
            'type' => 'left',
            'conditions' => array(
                'Profile.user_id = User.id'
            )
        ),
        array(
            'table' => 'media_assets',
            'alias' => 'MediaAsset',
            'type' => 'left',
            'conditions' => array(
                'MediaAsset.id = Profile.media_asset_id'
            )
        )
    )
));

连接工作完美,又称返回User,Profile和MediaAsset。但是,如果我允许Cake为我找到它,那么它将导致这种结构:(示例1)

User
Profile
---- MediaAsset

然而,手册发现如下:(示例2)

User
Profile
MediaAsset

无论如何,如果不进行更多查询,我可以检索它类似于Cake吗?

谢谢,Josh。

**编辑 澄清我想要实现的目标。 我的数据库将有很多表,并且很多表链接到User。但是我不想检索所有这些因为它浪费资源。 因此,我为每个请求运行的查询指定了手动连接,例如当前用户。

问题是我需要在Profile中获取MediaAsset,这样做很好(参见示例2)。但是Cake很好的格式化更有意义。

**给scrowler 此查找结果返回所有内容(用户,配置文件,车库,首选项,任何具有user_id的模型)

if (!$username || !$user = $this->find('first', array(
        'conditions' => array('User.username' => $username),
        'contain' => array(
            'Profile'
        )
    ))) {
    throw new NotFoundException('User not found');
}

1 个答案:

答案 0 :(得分:0)

在我的AppModel.php中我有:

public $actsAs = array('Containable');

然后在我有find方法的模型中:

$rs = $this->find('all', array(
        'recursive' => -1,
        'order' => array('User.created DESC'),
        'contain' => array(
            'Profile' => array(
               'MediaAsset' => array('fields' => array('id','profile_id' .... ),
               'fields' => array('id', 'created', .... )),
        ),
    ));

所有工作都没有任何问题,只是不要忘记添加'recursive'=> -1使用包含时。