2010年08月26日

cakephpでinnerjoin

だいたい普通に findall すると以下のデータが取得できる。
ちなみに関係は
Moteria(ユーザー) 1 に対して Usertag 多 の関係。

$ar = array(
	
    0 => array(
    	'Moteria' => array(
        	
            'id' => 103,
            'name' => '太郎'
        
        ),
        
        'Usertag' => array(
        	
            '0' => array(
            	'id' => 55,
                'name' => イケメン
            ),
            '1' => array(
            	'id' => 56,
                'name' => 素敵
            ),
        )
        
     ),
     
     1 => array(
    	'Moteria' => array(
        	
            'id' => 103,
            'name' => '花子'
        
        ),
        
        'Usertag' => array(
        	
            '0' => array(
            	'id' => 56,
                'name' => 素敵
            )
        )
        
     ),
     
     2 => array(
    	'Moteria' => array(
        	
            'id' => 103,
            'name' => 'ひでまん'
        
        ),
        
        'Usertag' => array(
        )
        
     ),

);


これだと Usertag を持っていないひでまんまでデータを拾ってくる。
そんな切ないことは避けたい。

でもcakephpはうまく言うことを聞いてくれない。
これを

タグを持っていないひでまんのデータを取得しないようにするには



$this->Moteria->bindModel(array('belongsTo'=>array('Usertag'=>array(	  
			  'foreignKey'=>false,
			 'conditions'=> array('Moteria.id=Usertag.user_id'),//Usertag を少なくとも一つ以上持っているユーザーのみ読み出す
			 //'conditions'=> array('Moteria.id=Usertag.user_id','Usertag.id=159'),//Usertag を少なくとも一つ以上持っているユーザー で Usertag の ID 159 を持っているユーザーのみ読み出す
			 //'conditions'=> array('Moteria.id=Usertag.user_id','Moteria.id=221'),//Usertag を少なくとも一つ以上持っているユーザー で Moteria の ID 159 を持っているユーザーのみ読み出す
			  'type'=>'inner',
			  'fields'=>array('count(Usertag.user_id) as num')))));
			
			$users=$this->Moteria->find('all', array('group'=>'Moteria.id'));


のように書けば良い。
すると

<?
$ar = array(
	
    0 => array(
    	'Moteria' => array(
        	
            'id' => 103,
            'name' => '太郎'
        
        ),
        
        'Usertag' => array(
        	
            '0' => array(
            	'id' => 55,
                'name' => イケメン
            ),
            '1' => array(
            	'id' => 56,
                'name' => 素敵
            ),
        )
        
     ),
     
     1 => array(
    	'Moteria' => array(
        	
            'id' => 103,
            'name' => '花子'
        
        ),
        
        'Usertag' => array(
        	
            '0' => array(
            	'id' => 56,
                'name' => 素敵
            )
        )
        
     )
);
?>


というデータを取得することができる。
関連するタグ: PHP cakephp MYSQL
あなたにとって有用な記事でしたか?是非ブックマークしておくことをおすすめします。



トップ - 最新の記事一覧 - お問い合わせ