web-dev-qa-db-ja.com

挿入/更新にcreateQueryBuilderを使用することは可能ですか?そうでない場合、どの機能を使用すればよいですか?

今のところ、Doctrineの関数createQueryBuilderを使用してデータベースからデータを取得する関数を作成することに成功しました。

データベースを挿入または更新する同様の機能があるかどうか誰かが知っていますか?または、createQueryBuilderをどのように使用できますか?

13
user1482442

Doctrine 2 ORMは [〜#〜] dql [〜#〜] または DQLクエリビルダー を介してINSERTをサポートしません。完全な構文については、 DQLのEBNF を確認してください。

ORMで挿入を処理するには、常に手動でエンティティをインスタンス化し、エンティティマネージャーで永続化します。

$user = new \My\Entity\User();

$entityManager->persist($user);
$entityManager->flush();

Doctrine ORMでDQLを介してSELECTUPDATEDELETEのみを処理できます。

  • 選択する:

    SELECT u FROM My\Entity\User u WHERE u.id = :userId
    
  • 更新:

    UPDATE My\Entity\User u SET u.status = 'banned' WHERE u.id = :userId
    
  • 削除する

    DELETE My\Entity\User u WHERE u.id = :userId
    

これらの操作はQueryBuilderでも処理できます。

  • 選択する:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->select('u')
        ->from('My\Entity\User', 'u')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
  • 削除:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->delete('My\Entity\User', 'u')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
  • 更新:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->update('My\Entity\User', 'u')
        ->set('u.status', 'banned')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
29
Ocramius

代わりにQueryBuilderを使用する別のオプションは、Doctrine DBAL準備および実行関数を使用することです。おそらくQueryBuilderを使用するほど柔軟性がありませんが、状況によってはINSERTを実行することが役立つ場合があります。

使用方法は、エンティティマネージャーからデータベース接続を取得することです。

$sql = "INSERT INTO table (field1, field2) VALUES ('foo', 'var')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->bindValue(':invoice', $invoiceId);
$result = $stmt->execute();
5
Javier Seixas

DBAL queryBuilderを使用する場合、挿入することが可能です。

$qb = $connection->createQueryBuilder();

QueryBuilderで挿入するには、次のようにします。

$qb->insert('MuBundle:MyClass', 'momc')
   ->values (array(
       'property1 (id for example)' => '?'
       'property2 (name for exmaple)' => '?'
   ))
   ->setParameter(0, $id)
   ->setparameter(1, $name)
4
mlwacosmos

queryBuilderを使用してデータを挿入することは、DQLまたはSQLを書く意思がない限り不可能です。データベーステーブルにデータを簡単に挿入する方法を探している場合は、最初に、データを挿入するテーブルのEntityクラスにデータが読み込まれていることを確認する必要があります。たとえば$em->persist($entity);

0
Rancantemos