Ошибка Symfony2 ожидает, что параметр 1 будет объектом, заданным целым числом

У меня есть отношения "один ко многим" между ролями и ролями пользователей.

class User {
    /**
     * @ORM\OneToMany(targetEntity="PNC\PermissionsBundle\Entity\UserRoles", mappedBy="user", cascade={"persist", "remove"})
     */
    protected $usersRole;
}

class UserRoles {
    /**
     * @ORM\ManyToOne(targetEntity="PNC\PermissionsBundle\Entity\Roles", inversedBy="usersRole", cascade={"persist"}, fetch="EAGER")
     * @ORM\JoinColumn(name="role_id", referencedColumnName="id")
     */
    protected $role;
    /**
     * @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="usersRole", cascade={"persist"}, fetch="EAGER")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;
}


class Roles {
    /**
     * @ORM\OneToMany(targetEntity="PNC\PermissionsBundle\Entity\UserRoles", mappedBy="role", cascade={"persist", "remove"})
     */
    protected $usersRole;
}

Мне нужно вставить в объект UserRoles. У меня есть только $ user как объект, но $ role как id.

$user_roles = new UserRoles();
$role = $em->getRepository('PNCPermissionsBundle:Roles')->findRoleByID($id);

$user_roles->setRole($role if(is_object($role)){
                    var_dump('it is an object...');exit;
                }else{
                    var_dump('it is not an object...');exit;
                });
$user_roles->setUser($user);
$user_roles->setIsPrimary(false);
$em->persist($user_roles);
$em->flush();

а функция RoleRepository выглядит как

public function findRoleByID($role_id){
        return $this->createQueryBuilder('r')
            ->select('r.id')
            ->Where('r.id = :role_id')
            ->setParameter('role_id', $role_id)
            ->getQuery()
            ->getOneOrNullResult()
            ;
    }

я понимаю, что $ role теперь ведет себя как целое число, но это должен быть объект Roles Entity.

РЕЗУЛЬТАТ var_dump равен

string(22) "it is not an object..."

Как id может сделать это в моем сценарии ....?


person Muhammad Taqi    schedule 10.11.2015    source источник
comment
То, что вы опубликовали, похоже, должно работать. Вы уверены, что он жалуется на setRole?   -  person Cerad    schedule 10.11.2015


Ответы (1)


Я думаю, вы можете сделать то же самое и без объекта UserRoles!

Попробуйте для $ user-> ролей

 /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
     * @ORM\JoinTable(name="users_roles",
     *   joinColumns={
     *     @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="role_id", referencedColumnName="id")
     *   }
     * )
     */
    protected $roles;

И для пользователей $ role->

 /**
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
     */
    private $users;

и метод в сущности пользователя ->

   /**
     * @param Role $role
     * @return $this
     */
    public function addRole(Role $role)
    {
        $this->roles->add($role);
        return $this;
    }

Итак, ваше действие будет выглядеть так:

$user->addRole($role);
$em->persist($user);
$em->flush();
person alexsila    schedule 10.11.2015
comment
Обратите внимание на $ user_roles- ›setIsPrimary (false); линия? Ему нужны дополнительные атрибуты для UserRole. - person Cerad; 10.11.2015
comment
Было бы здорово узнать, в каком контексте это используется. - person alexsila; 10.11.2015
comment
Он хочет иметь несколько ролей, одна из которых помечена как основная. Немного необычно, но это нормально. И, конечно же, отношение ManyToMany Doctrine не поддерживает дополнительные атрибуты. - person Cerad; 10.11.2015
comment
Было бы неплохо взглянуть на сообщение об исключении. К сожалению, я не могу это комментировать под его вопросом. Я думаю, что у меня была аналогичная проблема с Doctrine, и решение заключалось в том, чтобы установить user_id и role_id напрямую, а не через объекты. - person alexsila; 10.11.2015
comment
Что ж, суть Doctrine 2 Object Relation Manager - это объекты. Вы очень редко имеете дело с id напрямую. Сообщение об ошибке было бы неплохо. Как написано, вопрос не имеет особого смысла. - person Cerad; 10.11.2015
comment
@Cerad @alexsila. Я также думаю об использовании запроса raw sql для помещения user_id и role_id в user_roles table, но в этом случае я должен предоставить Identity $id объекта UserRoles, это то, чего я тоже не хотел. - person Muhammad Taqi; 10.11.2015