0

次のような関連付けを持つ 3 つのテーブルがあります。

テーブル:

予約.id、bookings.start、bookings.stop、bookings.listing_id

special_prices.id、special_prices.start、special_prices.stop、special_prices.price、special_prices.listing_id、

そしてもちろんListingsテーブル。

関連付けはすべて、cake bake の厚意により Model ファイルで設定されています。ユーザーは、エリア、開始日、終了日に従ってすべてのリストを検索できます。リストに含まれる可能性のある予約の日付の間に開始日がない場合にリストのみが返される一連の結果を取得しようとしています。

私の検索機能には次のものがあります。

$conditions = array(
"AND" => array(
    "OR" => array(
                "Listing.address_one LIKE" => "%".$area."%",
                "Listing.address_two LIKE" => "%".$area."%",
                "Listing.city LIKE" => "%".$area."%",
                "Listing.postcode LIKE" => "%".$area."%",
                "Listing.title LIKE" => "%".$area."%",
                ),
                )
            );

$this->Listing->bindModel(array('hasMany' => array('Booking' => array('conditions' =>array('Booking.checkin BETWEEN ? AND ?' => array($to, $from))))));
$data = $this->paginate('Listing', $conditions);
$this->set('data', $data);

私はここで読んだ:http://ibndawood.com/2011/10/how-to-filter-hasmany-related-model-records-in-cakephp-when-using-find-function/他のオプションを使用することです

$this->Listing->hasMany['Booking']['conditions'] = array('Booking.checkin BETWEEN ? AND ?' => array($to, $from));

しかし残念ながら、これらは両方とも、データベース内のエリアに一致するすべてのエントリを返すだけですが、Bookings テーブルは完全に無視されているようです。条件を作ってみた

'Booking.id' => '5'

テストしますが、これも無視します。

誰かが私のためにこれに光を当てることができますか. ドキュメントにはあまり多くの例がなく、何がうまくいかないのですか。

編集

ページネーションの際に CakePHP は自動的に hasmany リレーションシップに参加しないため、bookings テーブルに参加するようにコードを追加する必要があることがわかりました。

現在、Bookings テーブルに問題なく結合しているように見えますが、複数の Listings のセットが返されています。誰でもこれを見て助けてもらえますか?これが私が今持っているものです:

$conditions = array(
                            "OR" => array(
                                "Listing.address_one LIKE" => "%".$area."%",
                                "Listing.address_two LIKE" => "%".$area."%",
                                "Listing.city LIKE" => "%".$area."%",
                                "Listing.postcode LIKE" => "%".$area."%",
                                "Listing.title LIKE" => "%".$area."%",
                            )
                        );


    $this->paginate = array(
               'joins'=>array(
                          array(
                           'table'=>'bookings',
                           'alias'=>'Booking',
                           'type' =>'inner',
                           'conditions' =>array('Booking.checkin NOT BETWEEN ? AND ?' => array($to, $from))
                          )
                        ),
                'conditions'=> $conditions
                );

    $data = $this->paginate();
4

1 に答える 1