AS句を使用したMysqliが機能しない

Aug 18 2020

結合されている2つのテーブルがあります。どちらにもid列があります。

$query ->select($db->quoteName(array(
'a.id',
'a.address_one',
'a.address_three',
'a.address_two',
'b.id AS myStuff',
'b.person_id'
'b.packages_id',
'b.payment_date',

)))

->from($db->quoteName('#__person','a')) ->join('INNER', $db->quoteName('#__licence', 'b') . ' ON (' . $db->quoteName('a.id') . ' = ' . $db->quoteName('b.person_id') . ')')
->where($db->quoteName('a.published') . ' = '. $db->quote('1'))
->where($db->quoteName('b.published') . ' = '. $db->quote('1'));

ただし、AS句は機能せず、エラーをスローします。

返されるクエリにはbid AS myStuff

のではなく

bidmyStuffとして、

句について考えられるすべての組み合わせを試しましたが、何を使用してもエラーが発生します。

クエリでAS句を使用するための正しい形式を誰かに教えてもらえますか?

更新

したがって、b.id AS行を削除してから、別の行を追加すると、

$ query-> select( 'b.id AS myStuff');

`マークがないにもかかわらず、クエリは機能します。元のクエリ内ですべてに取り組む他の方法がないかどうかはわかりません。

回答

2 Sharky Aug 18 2020 at 21:29

エイリアスは、2番目の引数としてに渡す必要がありますquoteName()。最初の引数が配列の場合、2番目の引数も同じ長さの配列である必要があります。値のない列の場合は、を渡す必要がありnullます。あなたの場合、これはよく見えません:

$query ->select( $db->quoteName(
            array(
                'a.id',
                'a.address_one',
                'a.address_three',
                'a.address_two',
                'b.id',
                'b.person_id',
                'b.packages_id',
                'b.payment_date',
            ),
            array(
                null,
                null,
                null,
                null,
                'myStuff',
                null,
                null,
                null,
            )
        )
    )

すでに述べたように、エイリアスを使用して列を分割できます。引用符で囲んだままにしておきたい場合(識別子に予約済みのキーワードが含まれていない限り、実際には必要ありません)、別のquoteName()呼び出しでラップするだけです。

$query->select( $db->quoteName(
        array(
            'a.id',
            'a.address_one',
            'a.address_three',
            'a.address_two',
            'b.person_id',
            'b.packages_id',
            'b.payment_date',
        )
    )
)
    ->select($db->quoteName('b.id', 'myStuff'));

個人的には、個別に引用された列の配列を渡すことを好みます。書くコードは多くなりますが、1回のselect()呼び出しでエイリアスと式の有無にかかわらず列を混在させることもできます。また、quoteName()現在の配列の処理方法により、高速になっています。

$query->select(
    array(
        // Allows column without alias.
        $db->quoteName('a.id'), // Allows column with alias. $db->quoteName('b.id', 'myStuff'),
        // Allows expressions.
        COUNT(*),
    )
)