CakePHP显示数组的自定义字段

时间:2010-12-04 17:37:29

标签: arrays cakephp filter

我知道标题并没有描述我想达到的最佳效果,但我想不出别的。

假设我有以下数组:

[Sender] => Array
            (
                [0] => Array
                    (
                        [id] => 1
                        [username] => admin
                        [PrivateMessagesUser] => Array
                            (
                                [id] => 1
                                [private_message_id] => 1
                                [sender_id] => 1
                                [recipient_id] => 3
                                [sender_status] => 1
                                [recipient_status] => 0
                                [random_key] => 
                            )

                    )

                [1] => Array
                    (
                        [id] => 1
                        [username] => admin
                        [PrivateMessagesUser] => Array
                            (
                                [id] => 3
                                [private_message_id] => 1
                                [sender_id] => 1
                                [recipient_id] => 2
                                [sender_status] => 1
                                [recipient_status] => 0
                                [random_key] => 
                            )

                    )

            )

我正在使用ContainableBehaviour来切断额外的数据。 我的问题是:如何在Sender中出现的密钥后过滤出PrivateMessagesUser?假设我只需要Sender PrivateMessagesUser.recipient_id = 3。 我试过

'Sender' => array( 
 'PrivateMessagesUser' => array(

 )
),

但它不起作用。看起来我必须以某种方式克服[0],[1] ......键,我不知道如何。

任何帮助将不胜感激!

修改

以下是我获取上面发布的数组的方法:

$this->paginate = array(
        'conditions' => array(
            'PrivateMessage.id' => $this->__getUserPrivateMessagesInbox()
        ),
        'contain' => array(
            'Sender' => array(
                'fields' => array('id', 'username'),
                'PrivateMessagesUser' => array(
                    'fields' => array('PrivateMessagesUser.id')
                    //'conditions' => array('PrivateMessagesUser.recipient_id' => $this->Auth->user('id'))
                )
            ),
            'Recipient' => array(
                'fields' => array('id', 'username'),
                'conditions' => array('Recipient.id' => $this->Auth->user('id'))
            )
        )
    );

如何编辑这些行以获得所需的结果?

编辑2

我从PrivateMessagesController调用paginate()。

社团:

用户模型:

var $hasAndBelongsToMany = array(
    'PrivateMessageSent' => array(
        'className' => 'PrivateMessage',
        'joinTable' => 'private_messages_users',
        'foreignKey' => 'sender_id',
        'associationForeignKey' => 'private_message_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    ),
    'PrivateMessageReceived' => array(
        'className' => 'PrivateMessage',
        'joinTable' => 'private_messages_users',
        'foreignKey' => 'recipient_id',
        'associationForeignKey' => 'private_message_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )
);

PrivateMessage模型:

var $hasAndBelongsToMany = array(
    'Sender' => array(
        'className' => 'User',
        'joinTable' => 'private_messages_users',
        'foreignKey' => 'private_message_id',
        'associationForeignKey' => 'sender_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    ),
    'Recipient' => array(
        'className' => 'User',
        'joinTable' => 'private_messages_users',
        'foreignKey' => 'private_message_id',
        'associationForeignKey' => 'recipient_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    ),
);

PrivateMessagesUser Model:

var $belongsTo = array(
    'PrivateMessage' => array(
        'className' => 'PrivateMessage',
        'foreignKey' => 'private_message_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Sender' => array(
        'className' => 'User',
        'foreignKey' => 'sender_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Recipient' => array(
        'className' => 'User',
        'foreignKey' => 'recipient_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

数据库表格如下:

  • usersidusername,...
  • private_messagesidsubject,...
  • private_messages_usersidprivate_message_idsender_idrecipient_idstatus,...

2 个答案:

答案 0 :(得分:2)

有三种方法可以实现这一目标。

查看您返回的数据数组,我猜测PrivateMessagesUser belongsTo Sender

<强> 1。查询PrivateMessagesUser模型

有时,只需要查询正确的模型即可。您可以将条件直接应用于要应用限制的模型。

$this->Sender->PrivateMessagesUser->find('all', array(
    'conditions' => array('PrivateMessagesUser.recipient_id' => 3),
    'contain' => array('Sender')
));

<强> 2。将条件应用于相关模型

这不会一直有效,因为CakePHP的SQL生成并不总是按照您希望的方式工作。但在简单的情况下,例如hasMany关系,您可以使用:

$this->Sender->find('all', array(
    'conditions' => array('PrivateMessagesUser.recipient_id' => 3),
    'contain' => array('PrivateMessagesUser')
));

同样,只有当Cake为可包含的参数执行JOIN并使用正确的条件时,这才有效。

第3。使用联接

这种方法很简单但有点乱,因为它是高度可定制的。

$this->Sender->find('all', array(
    'joins' => array(
        array(
            'table' => 'private_messages_users',
            'alias' => 'PrivateMessagesUser',
            'type' => 'inner',
            'conditions' => array(
                'PrivateMessagesUser.sender_id = Sender.id',
                'PrivateMessagesUser.recipient_id' => 3
            )
        )
    )
));

我的最后一条建议是将此代码放入模型中。尽可能遵循“脂肪模型,瘦身控制器”的原则。

Sender模型中:

function fetchByRecipientId($recipientId) {
    ...
}
祝你好运!


编辑:为了使这项工作适用于分页,请按照上述方法操作,但使用以下格式:

$this->paginate = array(
    'PrivateMessagesUser' => array(
        'conditions' => array('PrivateMessagesUser.recipient_id' => 3),
        'contain' => array('Sender'),
        // 'order' => ... other keys if you wish
    )
);
$this->set('senders', $this->paginate());

答案 1 :(得分:1)

您可以将条件置于Containable中,如下所示:

$this->Sender->find('all', array(
   'contain' => array(
      'PrivateMessagesUser' => array('conditions' => array('recipient_id' => 3))
   )
));

编辑: 尝试修改$this->paginate,如下所示:

$this->paginate = array(
        'conditions' => array(
            'PrivateMessage.id' => $this->__getUserPrivateMessagesInbox()//array of message id's
        ),
        'fields' => array('PrivateMessagesUser.id'),
        'contain' => array(
            'Sender' => array(
                'fields' => array('id', 'username'),
            ),
            'Recipient' => array(
                'fields' => array('id', 'username'),
                'conditions' => array('Recipient.id' => $this->Auth->user('id'))
            )
        )
    )

然后调用您的paginate $this->paginate($this->PrivateMessage)