2

Containable動作を使用して、コメントのリストを取得しています(BelongsTo Post、これはQuestionに属し、Question hasMany Post、およびPost hasMany Comments;これらはすべてUsersに属します)。

$data = $this->Question->find ( 'first', 
    array ('contain' => 
        array ('User', 
               'Post' => array ('User', /* 'order' => 'User.created DESC'*/ )
        ) 
    ) 
);

上記のコメントのセクションをコメントアウトすると、機能します。これは予想されることだと思いますが、私が欲しいのは、見つかったすべての投稿であり、それらが属する「ユーザー」の「作成済み」フィールドの順に並べ替える必要があります。CakePHPでこのより深いレベルのソートを達成するにはどうすればよいですか?私はいつも「警告(512):SQLエラー:1054:不明な列'User.created'in'orderclause'」を受け取ります

ご協力いただきありがとうございます!

4

5 に答える 5

3

また、結合を使用しないfind呼び出しから関連するテーブルをグループ化しようとしている可能性があります。

デバッグレベルを1より大きい値に設定して、クエリログを表示し、Cakeがデータをフェッチするために2つのクエリを実行していないことを確認します。その場合、最初のクエリは実際には2番目のテーブルを参照していません。

このような状況で手動で結合を強制する場合は、次のリンクでNateが概説しているアドホック結合方法を使用できます。

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

于 2010-01-19T00:37:22.723 に答える
1

これを回避する方法は2つあります。1つ目は、モデルで直接2番目のレベルの関連付けを定義することです。これで、どこからでもこのデータにアクセスできるようになります。このように見えるはずです.....

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レベルのクエリを直接tefindまたはpaginateステートメントに追加することもできます。はすでに定義されています。たとえば、'Foo'が$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]'));

これが理解できるほど明確であり、誰かに役立つことを願っています。

于 2011-06-07T10:56:01.400 に答える
0

find()を呼び出す前に、次を追加できます。

 $this->Question->order = 'Question.created DESC';
于 2010-01-18T17:35:43.633 に答える
0

再帰値を確認してください。制限が大きすぎる場合は、包含可能なリンクであるIIRCを無視します。これに何度かぶつかったのを覚えています。複数のモデルを含めようとしましたが、recursiveオプションがに設定されていて0、何もプルされませんでした。1あなたの例では、 (デフォルト)の値で十分だと思いますが、明示的に0どこかに設定したのではないでしょうか。

于 2010-01-18T16:44:53.540 に答える
0

ええ、関連/関連モデルに基づいてソートする方法がわからなかったので、その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()が、残念ながら元の開発者はそのようにコーディングしていなかったので、ビューを作り直したくありませんでした。

于 2012-01-18T01:31:08.853 に答える