質問

私はコメントのリストを取得するには収容可能振る舞いを使用しています(質問に属しbelongsToのポスト、;質問hasManyのポスト、およびポストhasManyのコメント、これらのすべてのユーザーに属して)ます。

$data = $this->Question->find ( 'first', 
    array ('contain' => 
        array ('User', 
               'Post' => array ('User', /* 'order' => 'User.created DESC'*/ )
        ) 
    ) 
);
私は上記のコメントでセクションをコメントアウトするとき、

これは、動作します。私はこれが予想されますが、私はしたいが見つかりされる投稿のすべては、彼らが属する「ユーザー」の「作成した」フィールドの順にソートされなければならないとしています。どのように私は、CakePHPでのソートこの深いレベルを達成するのですか?

私はいつも、 ":SQLエラー:1054不明な列 'User.created' 'ORDER句' で警告(512)" を取得します

あなたの助けをありがとう!

役に立ちましたか?

解決

また、あなたは使用が参加していないのfind呼び出しから関連テーブル上のグループにしようとしている可能性があります。

クエリログを参照し、ケーキは、あなたのデータをフェッチするために2つのクエリを実行されていないことを確認することができますので、 1よりも何かそれ以上に、あなたのデバッグレベルを設定します。その場合は、最初のクエリは、実際に第二のテーブルを参照していない。

あなたは手動でこれらの状況で参加するユーザーが使用できるアドホック次のリンクでネイトによって概説された方法を結合します。

を強制したい場合

のhttp:/ /bakery.cakephp.org/articles/view/quick-tip-doing-ad-hoc-joins-in-model-findする

他のヒント

私はこの問題を回避するには、2つの方法を発見しました。 最初のモデルで直接第二レベルassociacionを定義することです。 今、あなたはどこにでも、このデータにアクセスする必要があります。 それは次のようになります.....

var $belongsTo = array(
'Foo' => array(
  'className' => 'Foo', //unique name of 1st level join ( Model Name )
  'foreignKey' => 'foo_id', //key to use for join
  'conditions' => '',
  'fields' => '',
  'order' => ''
),
'Bar' => array(
  'className' => 'Bar', //name of 2nd level join ( Model Name )
  'foreignKey' => false,
  'conditions' => array(
    'Bar.id = Foo.bar_id' //id of 2nd lvl table = associated column in 1st level join
  ),
  'fields' => '',
  'order' => ''
)
);

この方法の問題点は、それは彼らが必要以上に一般的なクエリーをより複雑にする可能性があることです。 あなたは、このようにも以下のような第2のレベルは、TE検索またはのpaginateステートメントに直接問い合わせを追加することができます(注:私はいくつかの理由のためにあなたが第2レベルに$ belongsToの関連付けを使用しないことが分かっが参加し、彼らならば、それらを再定義する必要があります。すでに定義されている。例えば「フー」がすでに$ belongsToの中で定義されている場合、あなたは以下の例のように、関連の仕事をするために、重複する「FOO1」を作成する必要があります。)

$options['joins'] = array(

array('table' => 'foos',
  'alias' => 'Foo1',
  'type' => 'inner',
  'conditions' => array(
    'CurrentModel.foo_id = Foo1.id'
  )
),
array('table' => 'bars',
  'alias' => 'Bar',
  'type' => 'inner',
  'foreignKey' => false,
  'conditions' => array(
    'Bar.id = Foo1.bar_id'
  )
)
);

$options['conditions'] = array('Bar.column' => "value");
$this->paginate = $options;
$[modelname] = $this->paginate();
$this->set(compact('[modelname]'));

私はこれを理解するために明確に十分であり、それは、誰かを助けることを願っています。

あなたの再帰的な値を確認してください。それはあまりにも制限するなら、それはIIRC、収容可能リンクを無視します。私はこれに数回ぶつけ覚えています。私は複数のモデルを含む試してみたが、私のrecursiveオプションが0するように設定したと、何も引かないになるだろう。あなたの例では、私は1(デフォルト)の値で十分だと思うだろうが、多分あなたは明示的に0のどこかにそれを設定しました?

あなたは)(以下を見つけるためにあなたの呼び出しの前に追加することができます

 $this->Question->order = 'Question.created DESC';

ええ、私はそうSet::sort()メソッドを使用して終了し、関連する/関連したモデルに基づいてソートする方法を考え出すことができませんでした。チェックアウトこの記事の良い説明ます。

// This finds all FAQ articles sorted by:
// Category.sortorder, then Category.id, then Faq.displaying_order
$faqs = $this->Faq->find('all', array('order' => 'displaying_order'));
$faqs = Set::sort($faqs, '{n}.Category.id', 'ASC');
$faqs = Set::sort($faqs, '{n}.Category.sortorder', 'ASC');

...そして、はい、それはおそらくCategory->find()する必要がありますが、残念ながら、元の開発者がコード、それはその方法ではありませんでした、と私は意見を手直ししたいしませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top