不确定这是否可行,但我希望从查询中创建一个学说集合。我的想法是使用一些预设值来填充集合,这样我就可以更新数据库,将其视为从旧系统导入/生成用户到新系统。我正在努力与存储库位。
实体
// 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();
}
}
}
答案 0 :(得分: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中那样工作,因为你的实体将是普通对象,而不是继承任何东西,没有任何特殊方法。将实体保存到新数据库的方法是抓取entity manager并调用其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,您的查询结果默认为hydrated到Doctrine entites。
答案 1 :(得分:1)
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;
}
}