基本上我想要做的是使用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仍然只执行第一个! 我过去两天做错了什么????? tnx任何帮助
答案 0 :(得分:0)
这是因为你试图在匿名函数(Closure)调用中使用$ avoidIDs,这在那里是不可用的。
你应该让它可用于该功能。
->contain(['Answers' => function($q) use ($avoidedIDs){..}
闭包还可以从父作用域继承变量。任何这样的 变量必须传递给使用语言构造。