2

SQLクエリをDoctrineに変換するのに問題があります。

私は次の設定をしています:

パス(階層)

Id | template_type | object_id | 名前| パス| rgt | lft | レベル

財産

Id | その他| 列

発達

Id | その他| 列

テンプレートタイプが「プロパティ」のパスを選択しようとしています(これらは常にプロパティテーブルに「object_id」のレコードがあります)。親パスに参加しようとしています(開発では常にレコードがあります)。テーブル)。

次の生のSQLは完全に機能します。

SELECT
    node.*,
    parent.*,
    development.*,
    property.*
FROM
    path AS node,
    path AS parent,
    development,
    property
WHERE
    node.lft
BETWEEN
    parent.lft AND  parent.rgt
AND
    node.template_type =  'Property'
AND
    parent.level = node.level - 1
AND
    development.id = parent.object_id
AND
    property.id = node.object_id

それをDoctrineに変換しようとすると、問題が発生しているようです。

$q = Doctrine_Query::create()

    ->select("node.*")
    ->addSelect("parent.*")
    ->addSelect("development.*")
    ->addSelect("property.*")

    ->from("Path node")
    ->addFrom("Path parent")
    ->addFrom("Development development")
    ->addFrom("Property property")

    ->where("node.lft BETWEEN parent.lft AND parent.rgt")
    ->addWhere("node.template_type = 'Property'")
    ->addWhere("parent.level = node.level - 1")
    ->addWhere("development.id = parent.object_id")
    ->addWhere("property.id = node.object_id");

生成されるクエリは次のとおりです。

SELECT p.id                          AS p__id, 
       p.template_type               AS p__template_type, 
       p.object_id                   AS p__object_id, 
       p.created_at                  AS p__created_at, 
       p.updated_at                  AS p__updated_at, 
       p.meta_page_title             AS p__meta_page_title, 
       p.meta_navigation_title       AS p__meta_navigation_title, 
       p.meta_path                   AS p__meta_path, 
       p.meta_keywords               AS p__meta_keywords, 
       p.meta_description            AS p__meta_description, 
       p.meta_visible_in_navigation  AS p__meta_visible_in_navigation, 
       p.root_id                     AS p__root_id, 
       p.lft                         AS p__lft, 
       p.rgt                         AS p__rgt, 
       p.level                       AS p__level, 
       p2.id                         AS p2__id, 
       p2.template_type              AS p2__template_type, 
       p2.object_id                  AS p2__object_id, 
       p2.created_at                 AS p2__created_at, 
       p2.updated_at                 AS p2__updated_at, 
       p2.meta_page_title            AS p2__meta_page_title, 
       p2.meta_navigation_title      AS p2__meta_navigation_title, 
       p2.meta_path                  AS p2__meta_path, 
       p2.meta_keywords              AS p2__meta_keywords, 
       p2.meta_description           AS p2__meta_description, 
       p2.meta_visible_in_navigation AS p2__meta_visible_in_navigation, 
       p2.root_id                    AS p2__root_id, 
       p2.lft                        AS p2__lft, 
       p2.rgt                        AS p2__rgt, 
       p2.level                      AS p2__level, 
       d.id                          AS d__id, 
       d.name                        AS d__name, 
       d.latitude                    AS d__latitude, 
       d.longitude                   AS d__longitude, 
       d.introduction                AS d__introduction, 
       d.description                 AS d__description, 
       d.thumbnail                   AS d__thumbnail, 
       d.path_id                     AS d__path_id, 
       p3.id                         AS p3__id, 
       p3.price                      AS p3__price, 
       p3.number_of_bedrooms         AS p3__number_of_bedrooms, 
       p3.key_features               AS p3__key_features, 
       p3.description                AS p3__description, 
       p3.thumbnail                  AS p3__thumbnail, 
       p3.property_type_id           AS p3__property_type_id, 
       p3.path_id                    AS p3__path_id 
FROM   path p, 
       path p2, 
       development d, 
       property p3 
WHERE  ( p.lft BETWEEN p2.lft AND p2.rgt 
         AND p.template_type = 'Property' 
         AND p2.level = node.level - 1 
         AND d.id = p2.object_id 
         AND p3.id = p.object_id ) 

この結果、次のエラーが発生します。

1054-'where句'の不明な列'node.level'

何か案は?「ANDp2.level=p.level --1」と表示されているはずですが、変換ノードではないようです。

何か案は?

4

1 に答える 1

1

複雑なクエリを取得し始めると、SQLコードを生成するためにDoctrineに依存したくない場合があります。Doctrineを満たすためにすでに機能しているクエリを変換しようとするときに経験している苦痛は言うまでもありません。

このような場合、私は通常、Doctrineクエリビルダーを介してクエリを渡すのではなく、SQLとしてクエリを実行することをお勧めします。

Doctrine_RawSql()を見てください

于 2010-11-19T15:02:47.217 に答える