-6

条件付きでデータベースから結果を取得しようとしています。where a = 1 and b != 2 など、多くの条件...

ここに私のコードサンプルがあります

$u = $this->ion_auth->user()->row()->id;

$hide=$this->find_hide_post();

$friend=$this->get_all_contacts();

この後、メインクエリを開始します

$this->db->where('user_id',$u);

foreach($friend as $fr)
{
  foreach($fr as $f)
  {
    if($f->sub_id !=$u)
    {
      $this->db->or_where('user_id', $f->sub_id);
    }
    elseif($f->obj_id !=$u)
    {
      $this->db->or_where('user_id', $f->obj_id);
    }

    $this->db->where('time >', $f->time);
  }
}

正しい結果が得られますが、これらの行を追加するたびに正しい結果が得られません。しかし、それらの投稿を結果から削除する必要があります。

foreach($hide as $h)
{
  $this->db->where('id !=', $h->post_id);
}

最後に私はこの道を通り抜けます

$result=$this->db->get('my_wall');
$row=$result->result();
print_r($row);

結果は次のとおりです。

配列 ( [0] => stdClass オブジェクト ( [id] => 18 [user_id] => 19 [post] => [img] => public/users/wall/pic/Messenger14.png [doc] => [video ] => [リンク] => [リンク名] => [アクセスID] => [いいね] => 0 [時間] => 1340792296 )

[1] => stdClass Object
    (
        [id] => 19
        [user_id] => 19
        [post] => This is my test Documents
        [img] => 
        [doc] => public/users/wall/doc/19/20745322_temp.pdf
        [video] => 
        [link] => 
        [link_name] => 
        [access_id] => 
        [like] => 0
        [time] => 1340792743
    )

IDが19などではない投稿は避けたいです。しかし、私の最後のクエリは機能していません:(、結果は同じです。

4

1 に答える 1

1

これは、ロジックが CodeIgniter の Active Record クラスとうまく混合されていないためです。混合することはできません。そうしないor_wherewhere、あいまいなロジックが得られます。クエリが適切になるように、ロジックを修正する必要があります。これが私が提案するものです。

ステートメントを書き直して、foreachすべてを配列にパックします。

$ids = array();
foreach ($friend as $fr) {
    foreach($fr as $f) {
        if (...) {
            $ids[] = $f->sub_id;
        }
    }
    $this->db->where('time >', $f->time);
}

... 等々。foreachステートメントが完成したら、代わりに次の行を追加します。

$this->db->where_in('user_id', $ids);

これにより、次のように SQL ステートメントを適切にレンダリングできるようになります。

foreach($hide as $h)
{
  $this->db->where('id !=', $h->post_id);
}
于 2012-07-07T20:27:13.407 に答える