CakePHP - 在$ this->模型 - > find()之后按ID查找用户名?

时间:2015-02-11 22:43:43

标签: cakephp

在执行$ this-> Event-> find()后,我得到以下结果:

array(
'Event' => array(
    'event_id' => '72',
    'user_id' => '54c7e9f9-2520-48ca-ab70-1dfccf31a6d6',
    'title' => 'dfg',
    'start' => '2015-02-11 20:28:00',
    'public' => '0'
),
'User' => array(
    'password' => '*****',
    'id' => '54c7e9f9-2520-48ca-ab70-1dfccf31a6d6',
    'username' => '*',
    'slug' => '',
    'password_token' => null,
    'email' => '*',
    'email_verified' => true,
    'email_token' => '*',
    'email_token_expires' => '2015-01-28 20:41:45',
    'tos' => true,
    'active' => true,
    'last_login' => '2015-02-11 23:17:48',
    'last_action' => null,
    'is_admin' => true,
    'role' => 'registered',
    'created' => '2015-01-27 20:41:45',
    'modified' => '2015-02-11 23:17:48'
),
'EventGuest' => array(
    (int) 0 => array(
        'id' => '84',
        'event_id' => '72',
        'guest_id' => '54db93be-0ef8-47d2-9bdb-118ccf31a6d6',
        'accepted' => '1'
    ),
    (int) 1 => array(
        'id' => '85',
        'event_id' => '72',
        'guest_id' => '54d1185f-8968-485e-b88f-1dd8cf31a6d6',
        'accepted' => '0'
    )
)

如何将guest_id解析为位于用户表中的用户名?

基本上我想要以下输出: ...

'EventGuest' => array(
    (int) 0 => array(
        'id' => '84',
        'event_id' => '72',
        'guest_id' => '54db93be-0ef8-47d2-9bdb-118ccf31a6d6',
        'username' => 'Test',
        'accepted' => '1'
    ),
    (int) 1 => array(
        'id' => '85',
        'event' => '72',
        'guest_id' => '54d1185f-8968-485e-b88f-1dd8cf31a6d6',
        'username' => 'Test2',
        'accepted' => '0'
    )
)

(请注意字段用户名

如何在不逐一查找每个用户名的情况下实现这一目标,还是包含一个漂亮的CakePHP功能?

关系:

事件:

属于关联:

  • 用户

的hasMany:

  • EventGuest

EventGuest:

属于关联:

  • 事件
  • 用户

用户

的hasMany:

  • 事件
  • EventGuest

请您解释一下,我如何有效地解决这个问题?

亲切的问候,

Battlestr1k3

3 个答案:

答案 0 :(得分:0)

您不会将名称输入用户名字段,而不是Cake如何格式化结果。你可以这样做:

假设您正在使用可包含的行为,请尝试以下方法:

'contain' => [
    'User',
    'EventGuest' => [
        'User' => [
            'fields' => [
                'User.username'
            ]
        ]
    ]
]

它应该给你这样的东西:

'EventGuest' => array(
    (int) 0 => array(
        'id' => '84',
        'event_id' => '72',
        'guest_id' => '54db93be-0ef8-47d2-9bdb-118ccf31a6d6',
        'accepted' => '1',
        'User' => array(
            'username' => 'Test'
        )
    ),
)

如果您迫切依赖于在数组中使用“username”键,则在Model :: afterFind()回调中运行该数组,并设置该键并从User数组中复制该名称。但我不会这样做,浪费处理时间。

答案 1 :(得分:0)

在Cakephp conventions之后,EventGuest表必须被称为EventUser。 那么,从用户到事件的关系是什么?我们只知道从事件到用户的关系.. 然后,如果我正确理解您的模型,您可以使用以下命令查找指定用户ID的事件:

$this->User->find('all',array('conditions'=>array('User.username'=>$id)));

其中$ id是您需要查找的用户名的ID。

答案 2 :(得分:0)

我通过设置让它工作     $ this-> Event-> recursive = 3; 但我认为我可以更有效地做到这一点,因为它甚至可以显示客人友谊中的数据。

编辑:使用以下行,输出看起来很好:     $这 - > Gamesession->包含(阵列( 'GamesessionGuest.User.username'));