0

包含可能な動作がどのように機能するか、または関連付けられたモデルから (およびそれに基づいて) データを取得する方法を理解できないようです。

次の 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;
4

1 に答える 1

0

Containable は、元のクエリに関連付けられたレコードを検索します。あなたがしているのは、find('all')まったくEvent条件のないモデルであるため、すべてのイベントが返されます。

次に、Containable は、指定されたものであり、また、によって関連付けUserRoleられているすべてのレコードを取得します。user_idEventevent_id

特定のユーザーのイベントのみを取得する場合は、次の 2 つの方法のいずれかを実行できます。

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);
于 2013-05-23T11:00:24.313 に答える