2011-01-15 4 views
1

アクティブなレコードはニートのコンセプトですが、時には複雑なクエリを扱うのが難しいことがあります。私はこれがCI文書が欠けている少なくとも1つの場所であることがわかります。mysql to codeigniterアクティブなレコードのヘルプ

とにかく、 これは私が書いたSQLです。それはまだロックされて、ユーザーが完了していないクエストの期待される結果を返し、ユーザーが要件レベル内:

SELECT writing_quests . * 
FROM `writing_quests` 
LEFT OUTER JOIN members_quests_completed ON members_quests_completed.quest_id = writing_quests.id 
LEFT OUTER JOIN members ON members.id = $user_id 
WHERE writing_quests.unlocked =1 
AND writing_quests.level_required <= $userlevel 
AND members_quests_completed.user_id IS NULL 

をユーザーがレベル内のこれは、CodeIgniterのアクティブレコードクエリでロックが解除されているすべてのクエストを返し、要件:

$this->db->select('writing_quests.*'); 
$this->db->from('writing_quests'); 
$this->db->join('members_quests_completed', 'members_quests_completed.quest_id = writing_quests.id', 'left outer'); 
$this->db->join('members', "members.id = $user_id", 'left outer'); 
$this->db->where('writing_quests.unlock', 1); 
$this->db->where('writing_quests.level_required <=', $userlevel); 
$this->db->where('members_quests_completed.user_id is null', null, true); 

私はNullsを要求している方法に何か間違いがあると思います。徹底するために、私はすべてを含めると思った。

+0

あなたは間違って何かがそこにあるものを意味していますか? – ifaour

+0

クエリが異なる結果を返します。 – JoeM05

答えて

0

私は、時にはCIアクティブレコードが物事を過度に複雑にすることがあることに同意します。問題が何であるかにいくつかの光を当てるかもしれません

echo $this->db->last_query(); 

$this->db->where('members_quests_completed.user_id IS ','NULL',false); 

プロファイラを有効にするかで生成されたクエリをエコーすることも試してみてください:句は、あなたのIS NULLのためにこれを試してみてください。

+0

なぜですか?彼のアプローチはちょうど良いです.. – ifaour

+0

彼は具体的には、問題がIS NULL節であると疑ったと述べたので、私は上記の構文を使用しましたが、彼はそうではありませんでした。 – BrynJ

+0

返信いただきありがとうございますが、これはうまくいかないようです。エラーが発生しました: 'on clause'の '10'が不明です '10'は$ user_idの値です。このクエリは、SQLで記述されていれば正常に動作します。私はとにかくやり遂げるかもしれないものです。この方法では、SQLクエリーでuserlevelを取得することができます。 – JoeM05

0

時にはCIが複雑になることがあります...ビットを簡略化するために、常に$ this-> db-> query(あなたの非常に長いクエリ)を使用することができます(文字列が正しくエスケープされていれば)。それは個人的な意見です。

0
$this->db->where('column IS NOT NULL') 
あなたのケースで

$this->db->where('members_quests_completed.user_id is not null'); 
関連する問題