Default value of Doctrine ORM association

Tags: , ,

I have the entity (such as below). I want to set some default values while creating. As you can see in __construct, it is easy to set the $name (string), but how can I set the $group? (for example I know that there is a group in database with id=122)

 * @ORMEntity
class Person {
    private $id;

    /** @ORMColumn(type="string") */
    private $name;

     * @ORMManyToOne(targetEntity="Group", inversedBy="persons")
     * @ORMJoinColumn(referencedColumnName="id")
    private $group;

    public function setGroup(Group $group)
        $this->group = $group;

    // ... setters/getters

    //construct default Person
    public function __construct()
        $this->setGroup($EXISTING_GROUP_FROM_MY_DB); // <<--------------


I agree with moonwave99 that this is poor design. Here you are trying to access the database (through the Doctrine service) from a place that is not container-aware (i.e. it does not, and should not, know about Doctrine).

I had a similar issue recently… pretty much the same exact issue, actually. But I didn’t want this logic to be inside the controller. So I wrote a service to take care of the User creation. And I gave that service access to the only other service it needed: Doctrine.

Here’s an example, where a User is created with all available Roles:

namespace MyBundleEntity;

class UserFactory
    private $doctrine;

    public function __construct($doctrine)
        $this->doctrine = $doctrine;

    public function generateNewUser($email, $password)
        $user = new User();

        // Since you have access to the Doctrine service, you can use $this->doctrine
        // to do anything you would normally do in your controller with $this->getDoctrine()
        $roles = $this->doctrine->getEntityManager()->getRepository("MyBundle:Role")->findAll();

        foreach ($roles as $role)

        return $user;

Now register that service in config.yml or services.yml, remembering to pass the Doctrine service to it:

        class: MyBundleEntityUserFactory
        arguments: ['@doctrine']

And that’s it… Now, in your controller, you can create a new User by doing:

public function MyController()
    $user = $this->get("mybundle.factory.user")->generateNewUser("", "password123");

Source: stackoverflow