ほぼ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 に慣れれば、多くのことに役立ち、高速で読みやすいクエリを作成できます。