6

現在、私は通常のクエリでCodeIgniterを使用しています。

$sql = "
    SELECT *
    FROM my_table
    WHERE item_id > 1
";    
$q = $this->db->query($sql);

私はActiveRecordを調べ始めましたが、見栄えがよく、使用するデータベースドライバーに関係なくクエリが作成されるという利点があります。ただし、一般的にプロジェクトごとに1つのデータベースタイプを厳密に使用するため、これは実際には私にとっての利益。

私の意見では、通常のクエリ(私の例のように)が読みやすく、保守しやすいことがわかったので、現在、通常のクエリを維持することを考えています。

上記の理由に加えて、私はどちらを選ぶべきですか、そしてどのような理由で?

ありがとうございました

4

7 に答える 7

9

私は通常のクエリを実行することを好みます。CI のアクティブ レコードは多くのメモリを消費します。すべての結果をメモリにロードするためです。お分かりでしょうが。複雑さに関しては、CI のアクティブ レコード シンタックスに固執するよりも、通常のクエリを使用する方が適切です。

于 2013-01-25T15:02:39.483 に答える
5

SELECT blah blahを書くのにうんざりしている単純なクエリの場合、通常のクエリを書いているときにシンテックスエラーが発生する可能性が高いため、アクティブレコードを使用してスタイルを少し変更できます。Active Recordは、専門家でない限り、間違いを犯す可能性が高い通常の構文を書く必要がないように、この目的のために設計されました。また、アクティブレコードはエスケープ機能を提供します。あなたはアクティブレコードに精通していません。それらは(単純な場合)読み取り可能です。この例を見てください

$array  =   array(
        'user.username',
        'user.email',
        'user.password',
        'other.blah',
        'other.blah'
);
$where  =   array(
        'active'    =>  1,
        'other'     =>  'blahblah'
);  

return $this->db
        ->select($array)
        ->from('user')
        ->join('other','other.user_id = user.id','left')
        ->where($where)
        ->get()
        ->result();    
于 2013-01-25T14:21:19.303 に答える
5

ほぼ2年後、私はこの質問を見つけました。私の同僚の何人かは、すでにいくつかの長所または短所について回答しています。私の個人的な経験から意見を追加したいと思います。

一部の人が言ったように、私もアクティブ レコードを使用して、非常に複雑なクエリに対して純粋なストレート SQL を使用することがあります。その理由は、多くの os パラメータを受け取り、それに応じてクエリを変更するメソッドが必要な場合に使用するのが非常に簡単だからです。たとえば、「オプション」と呼ばれるパラメーターの配列を受け取るメソッドがあります。

if(!empty($options['login']))
{
    $this->db->where('tl.login', $options['login']);
}
if(!empty($options['ip']))
{
    $this->db->where('tl.ip', $options['ip']);
}
if(!empty($options['sucesso']))
{
    $this->db->where('tl.sucesso', $options['sucesso']);
}

if(isset($options['usuarios_existentes']) && $options['usuarios_existentes'])
{
    $this->db->join('usuario u', 'tl.login = u.login');
}
else
{
    $this->db->join('usuario u', 'tl.login = u.login', 'LEFT');
}

if(!empty($options['limit']))
{
    $this->db->limit($options['limit']);
}
else
{
    $this->db->limit(50);
}

return $this->db->select('tl.id_tentativa_login, tl.login, DATE_FORMAT(tl.data, "%d/%m/%Y %H:%i:%s") as data, tl.ip, tl.sucesso', FALSE)
                ->from('logs.tentativa_login tl')
                ->order_by('tl.data', 'DESC')
                ->get()->result();

もちろん、これは単純な例にすぎませんが、汎用の「get」メソッドを変更できる数百の行と条件を持つメソッドを作成しました。アクティブ レコードを使用すると、途中でコードを記述する必要がないため、非常に読みやすくなります。クエリを適切にフォーマットします。

条件付きの結合やその他のものを使用することもできるため、一般的な集中型メソッドを使用できます。これにより、ほとんどのコードを書き直したり、その一部を複製したりすることを回避できます (メンテナンスにはひどい)。読みやすいだけでなく、必要なものだけをロードするため、クエリが高速になります。

if(!empty($opcoes['com_maquina']))
{
    if(strtoupper($opcoes['com_maquina'])=='SIM')
    {
        $this->db->join('maquina m', 'm.id_local = l.id_local');
    }
    elseif(strtoupper($opcoes['com_maquina'])=='NAO')
    {
        $this->db->join('maquina m', 'm.id_local = l.id_local', 'LEFT');
        $this->db->where('m.id_maquina IS NULL');
    }
}

ActiveRecord のもう 1 つの良い点は、ステートメントで純粋な SQL (サブクエリなど) を受け入れるため、好きなように使用できることです。

私は利点について話していますが、純粋な SQL は常により高速に実行され、関数を呼び出すオーバーヘッドがないことは明らかです。しかし、実を言うと、ほとんどの場合、php パーサーはそれを非常に高速に実行するため、最終結果に表現的な方法で影響を与えることはありません。また、多くの手動条件を作成する必要がある場合、コードはアクティブレコードと同じくらい遅くなる可能性があります。とにかくパーサー。

プログラムされた論理的な方法でクエリを作成しようとするため、アクティブレコードクエリが期待どおりに機能しない場合があることに注意してください。たとえば、「OR」ステートメントを使用する場合は注意してください。ほとんどの場合、それを分離します(および):

$this->db->where('(m.ultimo_status < DATE_ADD(NOW(), INTERVAL -2 HOUR) OR m.ultimo_status IS NULL)');

( ) をドットで追加しない場合、OR ステートメントは where 句全体に影響します。そのため、activerecord に慣れれば、多くのことに役立ち、高速で読みやすいクエリを作成できます。

于 2014-11-09T14:46:51.220 に答える
4

私の主な理由は、高速かつ安全に動作することです。値などを自動的にエスケープするため。ただし、複雑なクエリに関しては、通常のクエリ文字列を使用することをお勧めします。

(結合などについては話していません。codeigniterはそれをかなりうまくサポートしているので、読みやすいです)ピボットクエリのように、または行番号による選択(以下のように)

$query = $this->db->query('SELECT * FROM
  (SELECT  @row := @row + 1 as row, t.*
   FROM `default_red_albums` t, (SELECT @row := 0) r) AS view
WHERE `row` IN(' . $in . ')');

return $query->result();
于 2013-01-25T13:59:55.577 に答える
2

クエリにオブジェクト モデルを使用することには大きな利点があります。文字列の解析と連結を実行して、複数の関数に対するクエリを作成できますが、これには時間がかかり、エラーが非常に発生しやすくなります。オブジェクト モデルを使用すると、参照を渡してクエリの作成を続行するか、実行前にプリプロセッサに渡すことができます。

人為的な例として、creation_date フィールドを持つテーブルのすべてのクエリに日付フィルターを自動的に追加することがあります。

CI では、生の SQL とオブジェクト モデルをかなりうまく組み合わせることができます。基本的に、ハイドレート オブジェクトの結果を返すカスタム クエリを作成します。

于 2013-07-15T17:23:24.390 に答える