0

これが可能かどうかはわかりませんが、クエリから教義コレクションを作成しようとしています。アイデアは、コレクションにいくつかの事前設定された値を入力することです。これにより、データベースを更新して、古いシステムから新しいシステムにユーザーをインポート/生成するように考えることができます。リポジトリビットに苦労しています。

実在物

// Portal\UserBundle\Entity\User.php

namespace Portal\UserBundle\Entity;
use Doctrine\ORM\Mapping AS ORM;


/** 
 * @ORM\Entity
 */
class User
{
    /** 
     * @ORM\Id
     * @ORM\Column(type="integer")
     */
    private $id;

    /** 
     * @ORM\Column(type="string", length=255, nullable=false)
     */
    private $fistname;

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    // etc...
}

リポジトリ

namespace Portal\UserBundle\Entity\Repository;
use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
   public function getGenerateNewUsers()
   {
    // acts as an import from an old user table
    $sql = " SELECT firstname, surname, other FROM old_user_table ";

    $userCollection = .... not sure how I link query? 
    return $userCollection;       

   }
}

コントローラー内で呼び出す

上記を使用して、新しく生成されたユーザー ループをフェッチし、エンティティ メソッド オブジェクトなどにアクセスできるようにします。

class SetupController extends Controller
{
    public function indexAction(){

        $repository = this->getDoctrine()->getRepository('UserBundle:User');

        $newUsers =   $repository->getGenerateUsers();

        // I can now have access to the users with something like

        foreach($newUsers as $user){
          $user->setFirstName('testing');
          $user->save();
        }

    }
}
4

2 に答える 2

1

HoganはDQLについて言及しています。これはどのように見えるかですが、古いデータベースが接続されていることを確認する必要があります。結果はエンティティのコレクションであり、メソッド呼び出しを使用して、適切と思われるデータの一部またはすべてを格納できます。

namespace Portal\UserBundle\Entity\Repository;
use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
   public function getGenerateNewUsers()
   {
    $qb = $this->getEntityManager()
               ->getRepository('Bundle:Old_User')->createQueryBuilder('o');
    $query = $qb->getQuery();
    $results = $query->getResult();

    return $results;       
  }
}
于 2013-02-21T20:11:26.313 に答える
1

通常、このようなインポートでは、レガシー テーブルが新しいテーブルに (フィールド名、制約などに関して) 直接マップされず、同じ DBMS 内にない場合もあります。そのため、実際に最適なオプションはやや手動のアプローチ。従来の方法でレガシー データベースに対して SQL クエリを実行し、ユーザーを単純な配列として取得し、それらをループしてエンティティを作成します。

//Set up an empty collection
$collection = new ArrayCollection();

/*Assuming PDO where you have set up and executed a PDO statement $pdoStatement,
  but mysql_fetch_assoc or whatever is appropriate for your DBMS would work equally
  well. $oldUser should just be a plain associative array*/

while($oldUser = $pdoStatement->fetch(PDO::FETCH_ASSOC)){ 
    //Initialise an empty User entity
    $newUser = new User();

    //Set the properties on the entity using the values from your array
    $newUser->setFirstName($oldUser['firstname']);
    //etc

    //Add your user to the collection
    $collection->add($newUser);
}

return $collection

コントローラーでオブジェクトを呼び出すことを考えていることに気付きsave()ましUserたが、エンティティは何も継承せず、特別なメソッドを持たないプレーンなオブジェクトになるため、通常、Doctrine ではそのようには機能しません。エンティティを新しいデータベースに保存する方法は、エンティティ マネージャpersistを取得してそのメソッドを呼び出すことです。

コントローラーで:

$entityManager = $this->get('Doctrine')->getManager();
foreach($users as $user){
    //Manipulate the user here if you need to

    //Then persist it
    $entityManager->persist($user);
}

余談ですが、新しいデータベースに対してクエリを実行してエンティティのコレクションを取得したい場合、これは少し異なる問題であり、より洗練されたソリューションがあります。Doctrine Query Languageを使用すると、オブジェクトの言語を使用しながら、SQL のような方法でデータベースにクエリを実行できます。DQL を使用すると、クエリの結果はデフォルトでDoctrineエンティティにハイドレートされます。

于 2013-02-21T17:31:21.173 に答える