0

私はcakephp 2.3.0を使用しています。かなり長い間マニュアルを検索しましたが、google/stackoverflow も検索しました。

私はまだcakephpに少し慣れていません。私は $hasAndBelongsToMany (多対多) が機能するように取り組んできましたが、実際に機能しました...ワフー。しかし、同じモデルでは、以下のシナリオを機能させることができません。

Activity モデルと User モデルがあります。アクティビティには多数のユーザーが含まれる場合があります。ユーザーは多くのアクティビティを持つことができます。しかし、アクティビティのリストを、アクティビティの所有者とともに、すべて表の 1 行に Web ページに表示したいと考えています。

アクティビティ テーブルには、特に次の列が含まれます。

  • ID
  • 名前
  • 状態
  • owner_fk (Users.id への外部キー)

ユーザー テーブルには、特に次の列が含まれます。

  • ID
  • ユーザー名
  • パスワード
  • 役割

私のSQLは次のようになります:

select usr.username, actv.name 
from users usr, activities actv
where usr.users_id = actv.owner_fk

アクティビティ モデル(ユーザー モデルには同様のコードがあります):

class Activity extends AppModel {   
    var $name = 'Activity';

    public $hasAndBelongsToMany = array(
    'User' =>
        array(
            'className'              => 'User',
            'joinTable'              => 'activities_users',
            'foreignKey'             => 'activities_id',
            'associationForeignKey'  => 'users_id',
            'unique'                 => false,
            'conditions'             => '',
            'fields'                 => '',
            'order'                  => '',
            'limit'                  => '',
            'offset'                 => '',
            'finderQuery'            => '',
            'deleteQuery'            => '',
            'insertQuery'            => ''
        )
    );

たとえば、同じモデルに $hasOne があり、$hasAndBelongsToMany がある場合など、CakePHP が同じモデルで混合/一致を許可するかどうかはわかりません。私がやろうとしていることを達成するための簡単な方法、および/またはベストプラクティスがおそらくあります。私はいくつか実験しましたが、今のところ運がありません。

コントローラーの以下のコードで何かをしたいと思いますが、上記の SQL の where 句などの条件を使用します。

$this->set('results', $this->Activity->find('all'));
4

1 に答える 1

0

これは、ユーザー モデルの方向から簡単になります。本当にあなたは Cake に、そのユーザーが所有者であるすべてのユーザーの詳細とアクティビティの詳細を取得するように求めています。

したがって、次のようなものになります。

$this->set('primary_user_with_activity', $this->Activity->User->find('all'));

Cake の慣習によれば、その owner_fk フィールドは us​​er_id である必要があり、Activity モデルは所有者を定義するために user への belongs_to 関係で設定する必要があります。

次に、ユーザーモデルを設定して、アクティビティモデルのbelongs_toと一致するhas_oneリレーションを設定します

その後、has_and_belongs_to_many リレーションを追加する場合は、belongs_to リレーションとは異なるエイリアスを指定してください。

 public $hasAndBelongsToMany = array(
        'People' => array(
            'className' => 'User',
        )
    );

詳細はこちら: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

慣れるまで少し時間がかかりますが、慣習に従うことは本当に役に立ちます。

于 2013-03-05T05:16:10.337 に答える