0

大学のプロジェクト用に作成しているフレームワーク用の 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;
}
4

0 に答える 0