sql >> データベース >  >> RDS >> Mysql

SQL関数の結果をDoctrineのフィールドとして使用することは可能ですか?

    エンティティフィールドへの単一列の結果 -ネイティブクエリ およびResultSetMapping これを達成するために。簡単な例として:

    use Doctrine\ORM\Query\ResultSetMapping;
    
    $sql = '
        SELECT p.*, COUNT(r.id)
        FROM products p
        LEFT JOIN reviews r ON p.id = r.product_id
    ';
    
    $rsm = new ResultSetMapping;
    $rsm->addEntityResult('AppBundle\Entity\Product', 'p');
    $rsm->addFieldResult('p', 'COUNT(id)', 'reviewsCount');
    
    $query   = $this->getEntityManager()->createNativeQuery($sql, $rsm);
    $results = $query->getResult();
    

    次に、Productエンティティに$reviewsCountがあります。 フィールドとカウントはそれにマップされます。これは、Doctrineメタデータで次のように列が定義されている場合にのみ機能することに注意してください。

    /**
     * @ORM\Column(type="integer")
     */
    private $reviewsCount;
    
    public function getReviewsCount()
    {
        return $this->reviewsCount;
    }
    

    これは、によって提案されたものです。集計フィールド 教義の文書。ここでの問題は、基本的にDoctrineにデータベースにreviews_countという別の列があると思わせることです。 、それはあなたが望まないものです。したがって、これはその列を物理的に追加しなくても機能しますが、doctrine:schema:updateを実行した場合は その列を追加します。残念ながら、Doctrineは実際には仮想プロパティを許可していないため、別の解決策は、独自のカスタムハイドレーターを作成するか、loadClassMetadataにサブスクライブすることです。 イベントを実行し、特定のエンティティ(または複数のエンティティ)が読み込まれた後、自分でマッピングを手動で追加します。

    COUNT(r.id) AS reviewsCountのようなことをする場合は注意してください その後、COUNT(id)を使用できなくなります addFieldResult()で 関数であり、代わりにエイリアスreviewsCountを使用する必要があります その2番目のパラメータについて。

    を使用することもできますResultSetMappingBuilder 結果セットマッピングを使用するための開始点として。

    私の実際の提案は、余分なことをすべて行うのではなく、手動でこれを行うことです。基本的に、エンティティとスカラーの結果の両方を配列に返す通常のクエリを作成し、スカラーの結果をエンティティの対応するマッピングされていないフィールドに設定して、エンティティを返します。



    1. MySQL多対多選択

    2. docker-composeを使用してdjangoコンテナとmysqlコンテナをリンクする

    3. GROUP BY DESCはどのように順序を選択しますか?

    4. MariaDB BENCHMARK()の説明