継承と関連付けのシナリオからのDoctrineクエリの問題

レイモンドA

私はSymfony2で、次のモデルの教義を使って実装を行っています。 ここに画像の説明を入力してください

  • 親は1つ以上のトレーニングに申し込むことができます
  • トレーニングは特定のスキルに基づいていますが、同じスキルに対して異なる日に複数のトレーニングを行うことができます。
  • 親がトレーニングに参加すると、受講したトレーニングに関連するスキルの「資格」としてマークされ、研修生になります。
  • 親は同じスキルで複数のトレーニングに参加できますが、特定のスキルに対して「適格」とマークされるのは1回だけです。
  • 研修生は、さまざまなスキルで「資格を得る」ことができます

親と研修生の間の継承と関連付け(1対1)は、以下に示すように、単一テーブル継承を使用して実装されています。

Parents\ParentsBundle\Entity\Parents:
type: entity
inheritanceType: SINGLE_TABLE
discriminatorColumn:
    name: type
    type: string
discriminatorMap:
     parents: Parents
     trainee: Parents\TraineeBundle\Entity\Trainee
table: Parents
repositoryClass: Parents\ParentsBundle\Repository\ParentsRepository
id:
    id:
        type: integer
        generator:
            strategy: AUTO
fields:
    firstname:
        type: string
        length: 250
    lastname:
        type: string
        length: 250
    dob:
        type: date
        nullable: true
lifecycleCallbacks:
    prePersist: [ setDateDeCreationValue ]
manyToMany:
    trainings:
        targetEntity: Training\TrainingBundle\Entity\Training
        mappedBy: parents
        orphanRemoval: true
        cascade: ["all"]
oneToOne:
    trainee:
        targetEntity: Parents\TraineeBundle\Entity\Trainee
        inversedBy: parents
        cascade:  ["all"]
        joinColumns:
            trainee_id:
                referencedColumnName: id
indexes:
    nom_prenoms_idx:
        columns: [ firstname, lastname ]


Parents\TraineeBundle\Entity\Trainee:
    type: entity
    extends: Parents\ParentsBundle\Entity\Parents
    repositoryClass: Parents\TraineeBundle\Repository\TraineeRepository
    manyToMany:
            skills:
                targetEntity: Training\SkillBundle\Entity\Skill
                mappedBy: trainees
    oneToOne:
            parents:
                targetEntity: Parents\ParentsBundle\Entity\Parents
                mappedBy: trainee

Trianing\SkillBundle\Entity\Skill:
    type: entity
    table: Skill
    repositoryClass: Training\SkillBundle\Repository\SkillRepository
    id:
        id:
            type: integer
            generator:
                strategy: auto
    fields:
        title:
            type: string
            length: 80
            unique: true
        description:
            type: string
            length: 250
            nullable: true
    manyToMany:
        trainees:
            targetEntity: Parents\TraineeBundle\Entity\Trainee
            inversedBy: skills
            cascade: ["all"]
            joinTable:
                name: trainess_skills
                joinColumns:
                    skill_id:
                        referencedColumnName: id
                        nullable: false
                        onDelete: CASCADE
                inverseJoinColumns:
                    trainee_id:
                        referencedColumnName: id
                        nullable: false
    uniqueConstraints:
        titre_UNIQUE:
            columns:
                - titre

ただし、トレーニンググループのスキルで「資格がある」親のリストから次のような人を除外しようとしています。

  1. そのスキルのすべての準備ができている研修生

期待される結果を得ることができる次のSQLクエリがありますが、関連付けがエンティティにリンクしているため、Doctrineで機能するSQLクエリを使用できません。SQLクエリ

    SELECT p.*
  FROM Parents p
  LEFT JOIN training_formations tf
    ON p.id = tf.parents_id
  LEFT JOIN Training t
    ON tf.training_id = t.id
  LEFT JOIN Parents trainee
    ON p.intervenant_id = trainee.id
  LEFT JOIN trainees_skills ts
    ON trainee.id = ts.trainee_id
WHERE t.id=@trainingId and (t.skill_id <> ts.skill_id or p.trainee_id is null);

教義の質問:

$qb = $this->createQueryBuilder('p');
        $qb->select('p')
            ->leftJoin('p.trainings', 't')
            ->leftJoin('p.trainee','tr')
            ->leftJoin('tr.skill','s')
            ->where('t.id = :trainingId')
            ->andWhere($qb->expr()->orX(
                    $qb->expr()->neq('t.skill','tr.skill'),
                    $qb->expr()->isNull('p.trainee')
                                        )
                    )
            ->setParameter('trainingId', $trainingId)
            ->orderBy('p.firstname', 'ASC');
        return $qb;

結果のクエリはPathExpressionエラーをスローします。これは、外部キーで「IDENTITY()」メソッドを使用して修正しようとしましたが、utは機能しませんでした。

私は何かを逃したか、何かを間違って実装しましたか?

レイモンドA

更新されたDoctrineクエリの下に解決策が見つかりました:

$qb = $this->createQueryBuilder('p');
    $qb->select('p')
        ->leftJoin('p.trainings', 't')
        ->leftJoin('p.trainee','tr')
        ->leftJoin('tr.skill','s')
        ->where('t.id = :trainingId')
        ->andWhere($qb->expr()->orX(
                $qb->expr()->neq('t.skill','s.id'),
                $qb->expr()->isNull('s.id')
                                    )
                )
        ->setParameter('trainingId', $trainingId)
        ->orderBy('p.firstname', 'ASC');
    return $qb;

ただし、さまざまな読み方から、ここで使用されている継承よりもコンポジションの方が適しているようです。しかし、それは別のトピックです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Railsエンジンモデルから継承する際の関連付けの問題

分類Dev

Rails has_manyは、継承の問題との関連付けを通じて

分類Dev

リフレクションと継承の問題c#

分類Dev

別のクエリからの関連付けを使用したPHPクエリ

分類Dev

オブジェクト継承の問題のJavaリスト

分類Dev

CMD.Connectionの関連付けの問題-オブジェクトエラー

分類Dev

空のクエリからのPHPフェッチの関連付け

分類Dev

Mybatisのxml resultMapでのコレクションと関連付けの問題

分類Dev

JPA継承@EntityGraphには、サブクラスのオプションの関連付けが含まれます

分類Dev

Javaのジェネリックスと継承の問題

分類Dev

AdobeReaderアプリケーションの関連付けの問題

分類Dev

継承とプライベートオブジェクト、c ++に関連する特定の問題

分類Dev

Doctrine QueryBuilderクエリ:複数の関連付けがあります

分類Dev

継承されたオブジェクトでのシグナルとスロットの問題[Qt5]

分類Dev

オプションに関連付けられたヘルプ文字列からのPythonクリックエラー

分類Dev

2つのオブジェクトを継承と集約の両方に関連付けるのは悪いプログラミング慣行ですか?

分類Dev

Doctrine-逆側からの結合テーブルの関連付けを使用した1対多の単方向クエリ

分類Dev

リスト内のオブジェクトの継承に関するmypyの問題

分類Dev

phpmysqlクエリと配列の関連付け

分類Dev

継承と関連付け

分類Dev

レコードのクエリとそのsequelizeとの関連付け

分類Dev

C ++ポリモーフィック継承問題のエレガントなソリューション

分類Dev

ArrayListのジェネリック型とインターフェイスの継承に関する問題

分類Dev

クエリからの結果の注文に関する問題

分類Dev

JOINクエリからの出力の取得に関する問題

分類Dev

休止状態のツールとの多対1の単方向関連付けをリバースエンジニアリングする際の問題

分類Dev

Javaオブジェクトのシリアル化と継承

分類Dev

私のシナリオの関連付けを構築するのに助けが必要

分類Dev

ジェネリック/継承に関する設計上の問題

Related 関連記事

  1. 1

    Railsエンジンモデルから継承する際の関連付けの問題

  2. 2

    Rails has_manyは、継承の問題との関連付けを通じて

  3. 3

    リフレクションと継承の問題c#

  4. 4

    別のクエリからの関連付けを使用したPHPクエリ

  5. 5

    オブジェクト継承の問題のJavaリスト

  6. 6

    CMD.Connectionの関連付けの問題-オブジェクトエラー

  7. 7

    空のクエリからのPHPフェッチの関連付け

  8. 8

    Mybatisのxml resultMapでのコレクションと関連付けの問題

  9. 9

    JPA継承@EntityGraphには、サブクラスのオプションの関連付けが含まれます

  10. 10

    Javaのジェネリックスと継承の問題

  11. 11

    AdobeReaderアプリケーションの関連付けの問題

  12. 12

    継承とプライベートオブジェクト、c ++に関連する特定の問題

  13. 13

    Doctrine QueryBuilderクエリ:複数の関連付けがあります

  14. 14

    継承されたオブジェクトでのシグナルとスロットの問題[Qt5]

  15. 15

    オプションに関連付けられたヘルプ文字列からのPythonクリックエラー

  16. 16

    2つのオブジェクトを継承と集約の両方に関連付けるのは悪いプログラミング慣行ですか?

  17. 17

    Doctrine-逆側からの結合テーブルの関連付けを使用した1対多の単方向クエリ

  18. 18

    リスト内のオブジェクトの継承に関するmypyの問題

  19. 19

    phpmysqlクエリと配列の関連付け

  20. 20

    継承と関連付け

  21. 21

    レコードのクエリとそのsequelizeとの関連付け

  22. 22

    C ++ポリモーフィック継承問題のエレガントなソリューション

  23. 23

    ArrayListのジェネリック型とインターフェイスの継承に関する問題

  24. 24

    クエリからの結果の注文に関する問題

  25. 25

    JOINクエリからの出力の取得に関する問題

  26. 26

    休止状態のツールとの多対1の単方向関連付けをリバースエンジニアリングする際の問題

  27. 27

    Javaオブジェクトのシリアル化と継承

  28. 28

    私のシナリオの関連付けを構築するのに助けが必要

  29. 29

    ジェネリック/継承に関する設計上の問題

ホットタグ

アーカイブ