大学のプロジェクト用に作成しているフレームワーク用の SQL ライブラリを構築しています。すべてのヘルパー メソッドを終了しましたが、1 つのことで混乱しています。
左側の引数が集約関数で、右側の引数が変数である Haveing 句でパラメーターまたは値をバインドするにはどうすればよいですか?
連想配列を取り、準備済みステートメントの準備ができているようにフォーマットするヘルパーメソッドを作成したので、実行するだけです。
左側の引数が集約関数で、右側の引数が変数の場合、値/パラメータでバインドするようにパラメータを設定するにはどうすればよいですか?
また、副次的な質問として、bindparam と bind 値の両方を同じ stmt に含めることは可能ですか?
アドバイスは役に立ちます。より良い方法があれば教えてください。いつでも変更できることはわかっていますが、このオプションを使用することをお勧めします
public function test_having()
{
$query = new Query();
$query
->select('name','age','height')
->from('Person')
->where('id','=',33)
->having('name','>',9867);
//Works perfectly
$this->assertEqualsIgnoringCase(
"SELECT name,age,height FROM Person WHERE id = :id HAVING name > :name ",
$query->get_query()
);
}
public function test_having_with_left_hand_side_aggregage_function($value='')
{
$query = new Query();
$height = 220;
$query
->select('max(age) as max_age','person')
->from('Person')
->where('age','>',50)
->group_by('max_age, person')
->having('max(height)','>',$height);
$this->assertEqualsIgnoringCase(
"SELECT max(age) as max_age,person
FROM Person WHERE age > :age GROUP BY max_age,person
//Not sure if this is a valid prepared stmt?:
HAVING count(reviews) > :count(reviews) ",
$query->get_query()
);
}
配列をループし、キー、値、およびオペランドを配列に追加するメソッドに渡すヘルパー メソッドがあります。パラメータが適切に設定されましたが、変数を集計メソッドにバインドする方法がわかりません。
protected static function set_stmt($key, $op, $value, $logic_ops='')
{
if (is_object($value) && $value instanceof Query) {
$subquery = self::sort_subquery($value);
$stmt = $subquery['query'];
$stmt = ($logic_ops != '') ?
"$key $op $stmt $logic_ops " :
"$key $op $stmt ";
$result = [
'stmt' => $stmt,
'exec' => $subquery['exec'],
'params' => $subquery['params']
];
}else{
$params[$key] = ['key' => ":$key", 'value' => $value];
$stmt = ($logic_ops != '') ?
"$key $op :$key $logic_ops " :
"$key $op :$key ";
$result = [
'stmt' => $stmt,
'params' => $params,
];
}
return $result;
}