CakePHP Пользовательский поиск в многоуровневых модельных отношениях - PullRequest
0 голосов
/ 02 декабря 2011

Я надеюсь, что кто-то может пролить свет на эту проблему.Я прочитал тонны документов stackoverflow, документов тортов, работ, и я не могу решить эту проблему.У меня есть модельные отношения следующим образом:

  • Лошадь принадлежит Продавцу
  • Лошадь принадлежит Лоту
  • У продавца есть Лошадь
  • Лот имеетМную Продажу
  • Лот имеет много средств для вывода

Затем я перечисляю все лоты и отображаю таблицу с лошадью, продавцом, номером лота и т. Д. И т. Д. Это работает нормально, фактически используя Paginator :: SortМетод, который я могу сортировать, может быть Vendor.name ASC или DESC, который говорит мне, что ассоциации верны.

Однако я не могу, однако, манипулировать результатами поиска, основываясь на совпадении с ЛЮБЫМ полем, принадлежащим Продавцу.Например, если в моих настройках paginate я делаю что-то вроде этого:

'conditions' => array('Vendor.name' => 'Simon')...

Я получаю сообщение об ошибке SQL, что столбец Vendor.name не существует, но если я удалю это ограничение условий и затем оценим SQL, это, безусловно, есть.

Следует также сказать, что я использую методы unbindModel () и bindModel () для создания на лету отношений hasOne для оптимальных издержек MySQL, и это не привело кпроблема, как это было раньше.

Вот первая строка, которую я получаю, когда я var_dump () разбиваю на страницы:

'Vendor' => 
    array
      'id' => string '2' (length=1)
      'name' => string 'ALDORA STUD' (length=11)
      'surname' => string '' (length=0)
      'address' => string '' (length=0)
      'tel' => string '' (length=0)
      'fax' => string '' (length=0)
      'email' => string '' (length=0)
      'url' => string '' (length=0)
      'comments' => string '' (length=0)
      'created' => string '0000-00-00 00:00:00' (length=19)
      'modified' => string '0000-00-00 00:00:00' (length=19)
      'modified_by' => string '0' (length=1)
  'Withdrawal' => 
    array
      'id' => null
  'Sale' => 
    array
      'id' => null
      'catalogue_id' => null
      'lot_id' => null
      'purchaser' => null
      'amount' => null
      'notes' => null
      'date' => null

Я пропустил много строк, но выясно видно, что Vendor отправляется обратно как отношение hasOne к лоту, контроллеру, в котором я работаю.

Если это поможет, я использую этот код для отмены привязки и повторной привязки моделей:

        $this->Lot->unbindModel(array(
            'hasOne' => array('Horse'),
            'hasMany' => array('Withdrawal', 'Update', 'Sale'),
            'belongsTo' => array('Catalogue')
        ));

        $this->Lot->Horse->unbindModel(array(
            'belongsTo' => array('Vendor', 'Lot')
        ));

        $this->Lot->Horse->Vendor->unbindModel(array(
            'hasMany' => array('Horse')
        ));

        $this->Lot->bindModel(array(
            'hasOne' => array(
                'Catalogue' => array(
                    'foreignKey' => false,
                    'conditions' => array('Catalogue.id = Lot.catalogue_id')
                ),
                'Horse' => array(
                    'foreignKey' => false,
                    'conditions' => array('Horse.id = Lot.horse_id')
                ),
                'Vendor' => array(
                    'foreignKey' => false,
                    'conditions' => array('Vendor.id = Horse.vendor_id'),
                ),
                'Withdrawal' => array(
                    'foreignKey' => false,
                    'conditions' => array('Withdrawal.lot_id = Lot.id'),
                    'fields' => array('id')
                ),
                'Sale' => array(
                    'foreignKey' => false,
                    'conditions' => array('Sale.lot_id = Lot.id')
                )
            )
        ));

        $this->Lot->contain(array('Sale', 'Catalogue', 'Withdrawal', 'Horse', 'Vendor'));

Тогда мои вызовы на страницы будут выглядеть следующим образом:

$this->paginate = array(
                    'contain' => array('Sale', 'Catalogue', 'Withdrawal', 'Horse', 'Vendor'),
                    'conditions' => array('Vendor.name' => 'Somerset Stud'),
                    'maxLimit' => ($this->params['ext'] == 'csv' ? 1000 : 25),
                    'limit' => ($this->params['ext'] == 'csv' ? 1000 : 25),
                );

И вот тогда я получаю сообщение об ошибке, что столбец Vendor.name не существует.Если бы кто-нибудь мог поделиться некоторыми советами и идеями, я был бы вечно благодарен.

С уважением, Саймон

1 Ответ

0 голосов
/ 05 декабря 2011

Из того, что я вижу, вы не в контроллере / модели поставщиков, а в какой-то другой модели.

$this->paginate = array(
                  'contain' => array('Sale', 'Catalogue', 'Withdrawal','Horse',
                  'Vendor'  => array('conditions' => array('Vendor.name'=>'Stu'),
                                     'order'      => array(),
                                     'fields'     => array())
                );

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

Вот пример из книги http://book.cakephp.org/view/1323/Containable

$this->Post->find('all', array('contain' => array(
    'Comment' => array(
        'conditions' => array('Comment.author =' => "Daniel"),
        'order' => 'Comment.created DESC'
    )
)));
...