Sonata e コマースの保留中のプロジェクトがあり、それがどのように機能するかを理解する必要があります。Doctrine/MySQL に他のすべてのデータを残して、Doctrine/mongoDB で製品のバリエーションを管理したいと考えています。ということで、デモパーツでサンドボックスをインストールしてトレースしてみました。
これにより、getSelectSQL() メソッドを持つ ORM\Persiters\BasicEntityPersister にたどり着きました。
たとえば、旅行商品を編集するhttp://mysite/app_dev.php/admin/sonata/product/product/526/edit
と、$conditionSql 変数に次の SQL 条件が割り当てられます。
t0.id = ? AND t0.product_type IN ('sonata.ecommerce_demo.product.travel')
戻る前に getSelectConditionSQL() メソッドを出力すると、
t0.id = ?
したがって、問題は次のとおりです。AND t0.product_type IN ('sonata.ecommerce_demo.product.travel')
パーツはどこで生成され、何よりも、IN() ステートメントはどこから来るのでしょうか?
ドキュメントをパラメーターとして入れようとすると、
<service id="sonata.ecommerce_demo.product.travel.manager" class="Sonata\ProductBundle\Document\ProductManager">
<argument>Application\Sonata\ProductBundle\Document\Travel</argument>
<argument type="service" id="doctrine_mongodb" />
</service>
空の IN() ステートメントになってしまいます。
助けてくれてありがとう…</p>