2016-05-14 46 views
0

基本上我想做的事就是写这个查询使用CakePHP 3查询生成器:协会在那里与阵列CakePHP的第3

SELECT * FROM question as q innerjoin answers as a where q.question = $question AND a.id NOT IN = $avoidedIDs 

的表类

<?php 
namespace App\Model\Table; 


use Cake\ORM\Table; 
use App\Model\Entity\Comlib; 
use Cake\ORM\Query; 
use Cake\ORM\RulesChecker; 
use Cake\ORM\Validator; 
use Cake\ORM\TableRegistry; 

class ComlibsTable extends Table { 

public function initialize(array $config) { 
    parent::initialize($config); 
$this->table('questions'); 
// join the tables 
$this->hasMany('Answers' , [ 
'foreignKey' => 'question_id' 
]); 



    } 

public function LFA($live_req) { 
$query = $this->find()->where(['question' => $live_req])->contain(['Answers'])->LIMIT(6); 
$query = $query->toArray(); 

//include 5 answer 
return $query; 

    } 
    public function LFM($theid , $avoidedIDs, $question) 
    { 
    $query = $this->find()->where(['question' => $question])->contain(['Answers' => function($q){ 
    return $q 
    ->where(['Answers.id NOT IN' => $avoidedIDs]); 
    } 
    ]); 
    $query = $query->toArray(); 
    debug($query); 
    return $query; 

    } 
} 

,我得到的是错误代码:不可能生成带有空字段值列表的条件(Answers.id)。 但是当我print_r($ avoidIDs)我得到的值,我通过所以即时通讯确保$ avoidIDs不是空的,至少不包含功能,这是什么使它对我来说更加复杂,但是当我把一个数字,而不是我的变量将执行,如果我把1,2,3,4仍然只会执行第一个! 我在做什么错在过去2天????? tnx任何帮助

回答

0

这是因为你正试图在一个匿名函数(闭包)调用中使用$ avoidids,这在那里不可用。

您应该使其可用于该功能。

->contain(['Answers' => function($q) use ($avoidedIDs){..} 

闭包还可以继承父范围的变量。任何这样的 变量都必须传递给使用语言结构。

http://www.php.net/manual/en/functions.anonymous.php