CakePHPでは、どのように私は私がページ付けていますが、あるものに関連付けられている1に関連付けられていないモデルのための条件を設定することができますか?
-
25-09-2019 - |
質問
私は '顧客' モデル上(の$ this - > Customer->のpaginate())ページ付けています。
顧客モデルが順番に「ContactAddress」モデルに関連付けられている「コンタクト」のモデルに関連付けられています。
ですからます:
カスタマーhasManyの連絡先
連絡先belongsToのContactAddress
今、私は「新しい%%」
インデックス()」でのpaginate顧客にしたいです>私はこれをどのように行うのですか?私はのpaginateの条件でそれを行うとき、それは言う:「不明な列 『ContactAddress.cityを』 『where句』」論理的に
解決 2
私は非常に非常に満足のいくものである解決策を発見した。
私はページネーション機能の複雑なコードを見て、見つかった、論理的に、のpaginate条件を設定することと、(モデルが、それは自分の「のpaginate」関数のしている場合を除き)モデルのfind関数にこれらを渡します。
私は、最初のpaginate関数をオーバーライドしようとしたが、これはあまりにも複雑になりました。私が最後に見つかったソリューションを渡すことですモデルに「検索」やったときに、あなたがそれらを通過するだけのようなのpaginateのオプションに加入します:
//Set the pagination options:
`$this->paginate = array(
'limit' => 25,
'order' => array(
'Customer.lastname1' => 'asc'
),
'joins' =>
array(
// OUTER JOIN because I wanted to also
// fetch record that do not have a 'contact'
array(
'table' => 'contacts',
'alias' => 'Contact',
'type' => 'LEFT OUTER',
'conditions' => array(
'Customer.id = Contact.customer_id',
'Contact.class' => 'ContactAddress'
)
),
array(
'table' => 'contact_addresses',
'alias' => 'ContactAddress',
'type' => 'LEFT OUTER',
'conditions' => array(
'Contact.index = ContactAddress.id',
)
),
),
// In your conditions you can now use any table that
// was joined as well as the original 'customer' table.
'conditions' => $conditions,
);
$this->set('customers',$this->paginate('Customer'));
のどちらか、私はこれが誰かの役に立てば幸い方法!
他のヒント
ページの区切りが二度削除を条件に、どのような場合には困難ケーキかではありません。あなたの手順(ContactAddresses
にページ付け、その後、最初のContact.customer_ids
および関連Customer.id IN ($customer_ids)
を見つける。)でそれを行うためのいずれかが必要か、サブクエリでそれを行う必要があります。 (それはかなりではない、適切のサブクエリを行う方法についてマニュアルを参照してください。 )。
何より良いのは、結果のクエリのあなたのコーディングスキル、データベースのサイズと複雑さによって異なります。テストの両方とあなたのために働くかを決める。