あなたがやろうとしているのは、CakePHPを組み込んだものです。大きなことは、モデルが適切に関連付けられていることを確認することです。これが達成されると、ケーキはあなたのために大々的に持ち上げます。あなたの状況については
、このように関連する3つのモデルを使用:ケーキの規則に基づいて、あなたのテーブルを設定
class Story extends AppModel{
var $belongsTo = 'Author';
var $hasMany = 'Comment';
}
class Author extends AppModel{
var $hasMany = array('Story', 'Comment');
var $hasAndBelongsToMany = 'User';
}
class Comment extends AppModel{
var $belongsTo = array('Author', 'Story');
}
を。次に、あなたのコントローラにはほとんどCakePHPの魔法:何が起こっているの
$this->Story->Author->bindModel(array('hasOne' => array('AuthorsUsers')));
$myAuthors = $this->Story->Author->find('list', array(
'fields' => array('id'),
'conditions' => array('AuthorsUsers.user_id' => $userId),
'recursive' => false
));
$stories = $this->Story->find('all', array(
'fields' => array('Story.id', 'Story.title', 'Author.id', 'Author.name'),
'order' => 'published_date DESC',
'conditions' => array('Author.id' => $myAuthors),
'recursive' => 2
));
クイック説明:
bindModel()
はケーキができますが、あなたが関連付けられているユーザIDで著者を見つけるために、HABTMの関連付けを使用することを知っています。 (ケーキの規約では、 'authors_users'というテーブルを作成者 - >ユーザHABTMの関連付けに参加させることです)
$myAuthors
変数をデバッグすると、IDの単純な配列が得られます。
'conditions' => array('field' => array())
は「WHEREフィールドIN(...)」として解析されます。この例では、すべてのモデルを取得しますWHERE 'Author.id' IN $myAuthors
。
- 短い
$this->Story->find()
コールはケーキの美しさです。指定された条件に一致するすべてのStoryモデルを自動的に検索します。とは、発見された各ストーリーに関連する他のモデルを検出します。 (あなたはRecursiveをオフにするかContainable行動を使用して、関連するモデルを見つけることがないことを伝えることができます。)
$stories
変数は次のようにあなたの構造が表示されますデバッグ:
Array
(
[0] => Array
(
[Story] => Array
(
[id] => 1
[title] => 'Common Sense'
[published_date] => 1776-01-10
)
[Author] => Array
(
[id] => 1
[name] => 'Thomas Paine'
)
[Comment] => Array
(
[0] => Array
(
[id] => 1
[text] => 'Revolutionary!'
[Author] => Array
(
[id] => 3
[name] => 'Silence Dogood'
)
)
[1...n] => ...
)
)
[1...n] => ...
)
あなたが、その後することができますビュー内のその構造を使用して、必要に応じてデータを表示します。
ただ1つのクエリでそれを行う方法があるはずですが、この方法では動作し、サブクエリを実行するかカスタムCake find()
コールにカスタムSQLを挿入する必要はありません。
私はリレーションなどでモデルを正しく定義していますが、このパスに沿って何かを考えていましたが、レンダリングロジックを記述して配列を結合するのが最も簡単な方法ですが、私の配列にhtmlの大きな塊を持っている。理想的には、ユーザーがコメントしたストーリーと、ユーザーが投稿したストーリーを区別するための方法があります(それぞれの機会にストーリーを外していますが) – GaryDevenay