В CakePHP, как я могу установить условия для модели, которая не связана с той, которую я разбиваю на страницы, но которая связана с той, которая есть? - PullRequest
0 голосов
/ 28 сентября 2010

Я выполняю нумерацию страниц ($ this-> Customer-> paginate ()) в модели «Клиент».

Модель клиента связана с моделью «Контакт», которая, в свою очередь, связана с моделью «Клиент».Модель ContactAddress '.

Итак:

У клиента есть много контактов

Контакт принадлежит адресу ContactAddress

Теперь я хочу разбить клиентов на страницы в индексе Customers-> () 'используя поисковый запрос, скажем' ContactAddress.city 'LIKE'% New% '

Как мне это сделать?Когда я делаю это в условиях paginate, он говорит: «Неизвестный столбец« ContactAddress.city »в« where clause »» логически.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2010

Я нашел решение, которое очень очень удовлетворительно.

Я просмотрел сложный код функциональности разбивки на страницы и обнаружил, логически, что разбивка на страницы задает условия и передает их функции поиска модели (если модель не имеет своей собственной функции 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'));

В любом случае, надеюсь, это кому-нибудь поможет!

0 голосов
/ 28 сентября 2010

Нумерация страниц в состоянии, удаленном дважды, затруднительна в любом случае, торт или нет.Вы должны либо сделать это поэтапно (сначала найдите ContactAddresses и связанный Contact.customer_ids, а затем разбить на Customer.id IN ($customer_ids)), либо сделать это с помощью подзапросов.См. Руководство о том, как правильно выполнять подзапросы (это не красиво).

Что лучше зависит от ваших навыков кодирования, размера базы данных и сложности полученного запроса.Проверьте оба и решите, что работает для вас.

...