2011-08-02 1 views
0

モデルCakePHP - どのように私は舌twisterのすべての言語を見つけることができますか?

<?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)))); 
     } 

} 
?> 

私は早口言葉を持っているインデックスの言語を()見てみたいです。これどうやってするの?

答えて

2

あり、より効率的な方法であるが、ここでは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で言語モデルにアクセスすることができます。

+0

ありがとうございました!しかし、これは私にエラーをもたらします: 警告:SQLエラー:1054: 'where節' [CORE/cake/libs/model/datasources/dbo_source.php、行684]の 'Language.alias'列が不明です。表 "languages.alias"は "tonguetwisters.language_alias"に関連しています。 – Dennis

+0

'language_alias'を' language.alias'にタイプするか、またはリレーション定義に問題があります。 – JJJ

+0

はい、私のモデルの大文字の誤植でした。ありがとう!それは完全に動作します。 – Dennis

1

このために2つのSQLクエリを実行する必要はありません。テーブルは「language_alias」に参加している場合は、このような何かを行うことができます:あなたはちょうど適切にテーブルを結合するために起こっている1つのクエリを実行する必要があり

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') 
    )); 
} 

関連する問題