CakePHP - Как я могу найти все языки с скороговорками? - PullRequest
0 голосов
/ 02 августа 2011

Модель

<?php
class Tonguetwister extends AppModel {
        var $name = 'Tonguetwister';
        //The Associations below have been created with all possible keys, those that are not needed can be removed

        var $belongsTo = array(
                'language' => array(
                        'className' => 'language',
                        'foreignKey' => 'language_alias',
                        'dependent'=> true
                )
        );
}
?>

Контроллер

<?php
class TonguetwistersController extends AppController {

        var $name = 'Tonguetwisters';
        var $uses = array('Tonguetwister', 'Language');

        function index() {
                $this->set('languages', $this->Language->find('all'));
        }

        function view($id = null) {
                if (!$id) {
                        $this->Session->setFlash(__('Invalid tonguetwister', true));
                        $this->redirect(array('action' => 'index'));
                }
                $this->set('tonguetwisters', $this->Tonguetwister->find('all', array('conditions' => array('language_alias' => $id))));
        }

}
?>  

Я хочу видеть языки только в index (), в которых есть скороговорки. Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Возможно, есть более эффективный способ, но вот как выбрать только уникальные языки из таблицы Tonguetwister:

function index() {
    $languageList = $this->Tonguetwister->find( 
        'list',
        array(
            'fields' => array( 'language_alias', 'language_alias' ),
            'group' => 'Tonguetwister.language_alias',
            'recursive' => -1
        )
    );

    // $languageList is now an array that holds the language ids

    $this->set(
        'languages', 
        $this->Tonguetwister->Language->find(
            'all',
            array( 
                'conditions' => array( 
                    'Language.id' => $languageList
                ) 
            )
        )
    );
}

Кстати, вам не нужно помещать язык в $uses. Поскольку у них есть набор отношений, вы можете получить доступ к языковой модели с помощью $this->Tonguetwister->Language.

1 голос
/ 02 августа 2011

Для этого вам не нужно делать два SQL-запроса.Если таблицы объединены в «language_alias», вы можете сделать что-то вроде этого:

function index() {
    $this->Language->recursive = 0;
    $this->set('languages', $this->Language->find('all', array(
        'conditions' => array($this->Language->alias.'.language_alias' => $this->Tonguetwister->alias.'.language_alias')
    ));
}

Вы должны просто сделать один запрос, который будет правильно объединять таблицы.

...