1

propel 1.6.7 でデータを取得するのに苦労しています。

達成したいクエリのサンプルは次のとおりです。

select count(1) as amount, p1.local_id FROM panel_data pd
         JOIN panel_data_has_code pp1 on (pd.panel_data_id = pp1.panel_data_id)
         JOIN panel_code p1 on (pp1.panel_code_id = p1.panel_code_id AND p1.type='equipment'  AND model_id = 'my_model_id')
         JOIN panel_data_has_code pp2 on (pd.panel_data_id = pp2.panel_data_id)
         JOIN panel_code p2 on (pp2.panel_code_id = p2.panel_code_id AND p2.type='model' AND p2.local_id='my_local_id') 
         GROUP BY p1.local_id

しかし、Propel ORM で適切な基準を作成しようとすると、問題が発生します。明らかに、propel は、結合条件の追加を使用したり、select メソッドでエイリアスを使用しようとしたりするたびに、常に結合エイリアスをテーブル名に変換します。複数の結合条件を単純なfilterBy方法に置き換えました (常に内部結合を使用するため、効果は同じです) が、グループ化された列 (p1.local_id) の取得にまだ問題があります。

atmで作業するコードは次のとおりです。

PanelDataQuery::create()
            ->select(array( 'p1.localId'))
            ->withColumn('count(1)', 'amount')
            ->usePanelDataHasCodeQuery('pp1')->usePanelCodeQuery('p1')->groupByLocalId()->filterByType($type)->endUse()->endUse()
            ->usePanelDataHasCodeQuery('pp2')->usePanelCodeQuery('p2')->filterByType('model')->filterByLocalId($model)->endUse()->endUse()
            ->find();

上記のステートメントはエラーを返します。

SELECT ステートメントを実行できません [SELECT count(1) AS amount, panel_code.LOCAL_ID AS \"p1.localId\" FROM panel_data INNER JOIN panel_data_has_code pp1 ON (panel_data.PANEL_DATA_ID=pp1.PANEL_DATA_ID) INNER JOIN panel_code p1 ON (pp1.PANEL_CODE_ID) =p1.PANEL_CODE_ID) INNER JOIN panel_data_has_code pp2 ON (panel_data.PANEL_DATA_ID=pp2.PANEL_DATA_ID) INNER JOIN panel_code p2 ON (pp2.PANEL_CODE_ID=p2.PANEL_CODE_ID) WHERE p1.TYPE=:p1 AND p2.TYPE=:p2 AND p2. LOCAL_ID=:p3 GROUP BY p1.LOCAL_ID] [ラップ: SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server] マルチパート識別子 \"panel_code.LOCAL_ID\" をバインドできませんでした。

明らかに、select 句が問題を引き起こします。テーブル名に変換する代わりにテーブル エイリアスを使用するように propel を強制する方法はありますか?

よろしくお願いします。

4

1 に答える 1

0

部分的な解決策が見つかりました:

PanelDataQuery::create()
    ->withColumn('p1.local_id','localId')
    ->withColumn('count(1)', 'amount')
    ->select(array( 'localId','amount'))
    [...]

うまくいくようです。他の解決策をいただければ幸いです。addJoinConditionで同様の問題に対処する方法はまだ素晴らしいでしょう。

私が交換するとき:

->filterByType('model')->filterByLocalId($model)

元のクエリから、次を使用します。

->addJoinCondition('p2', 'p2.localId = ?', $model)
->addJoinCondition('p2', "p2.type = 'model'");

エラーで述べたように、同様の問題が発生しました: propel translates p2.localId to panel_code.local_id which is not correct (エイリアスを使用した複数の panel_code テーブル結合がクエリに含まれています)。

于 2013-10-16T09:26:03.240 に答える