Доктрина: неопределенный индекс при попытке получить доступ к php один-ко-многим - PullRequest
0 голосов
/ 20 октября 2018

У меня проблема с доктриной.У меня есть две сущности, и я хочу, чтобы работала корреляция один ко многим.

Пользователь

/**
 * @Entity
 */
class User
{
    /** @Id @Column(type="integer") @GeneratedValue */
    protected $id;

    /** @Column(type="string") */
    protected $name;

    /**
     * @OneToMany(targetEntity="role", mappedBy="userId", cascade={"ALL"})
     */
    private $roles;
}

Роли

/**
 * @Entity
 */
class Role
{
    /** @Id @Column(type="integer") 
     *
     * @ManyToOne(targetEntity="user", inversedBy="roles") 
     * 
     */
     protected $userId;

     /** @Column(type="string") */
     protected $name;
 }

Но когда я пытаюсь получить доступ к ролям пользователя:

var_dump($user->getRoles()->first()->getName());

Примечание: неопределенный индекс: userId в / home / ubuntu / workspace / atlas/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php в строке 1794 Предупреждение: указан неверный аргумент для foreach () в
/ home / ubuntu / workspace / atlas / vendor / doctrine / orm/lib/Doctrine/ORM/Persisters/Entity/BasicEntityPersister.php в строке 1798 строка (10) «ROLE_ADMIN» Предупреждение: неверный аргумент для foreach () предоставлен в /home/ubuntu/workspace/atlas/Controller/LoginController.php в строке15 "

Это означает, что я получил правильное значение, но несколько предупреждений, и я не уверен, что смогу их игнорировать.

1 Ответ

0 голосов
/ 20 октября 2018

Один пользователь может иметь Много ролей
Одна роль может принадлежать Много пользователей

Итакассоциация ManyToMany

Ваши отображения определены неправильно.Пожалуйста, подумайте о его замене следующим:

Пользователь

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @Entity
 */
class User
{
    /** 
     * @Id 
     * @Column(type="integer")
     * @GeneratedValue
     */
    protected $id;

    /**
     * @Column(type="string")
     */
    protected $name;

    /**
     * @ManyToMany(targetEntity="Role", inversedBy="users")
     */
    protected $roles;

    public function __construct()
    {
        $this->roles = new ArrayCollection();
    }

    public function getRoles()
    {
        return $this->roles;
    }

    public function addRole($role)
    {
        if (this->getRoles()->contains($role)) {
            return;
        } else {
            $this->getRoles()->add($role);
            $role->addUser($this);
        }
    }

    public function removeRole($role)
    {
        if (!this->getRoles()->contains($role)) {
            return;
        } else {
            $this->getRoles()->removeElement($role);
            $role->removeUser($this);
        }
    }
}

Роль

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @Entity
 */
class Role
{
    /**
     * @Id
     * @Column(type="integer") 
     * @GeneratedValue
     */
    protected $id;

    /**
     * @Column(type="string")
     */
    protected $name;

    /**
     * @ManyToMany(targetEntity="User", mappedBy="roles") 
     */
    protected $users;

    public function __construct()
    {
        $this->users = new ArrayCollection();
    }

    public function getUsers()
    {
        return $this->users;
    }

    public function addUser($user)
    {
        if (this->getUsers()->contains($user)) {
            return;
        } else {
            $this->getUsers()->add($user);
            $user->addRole($this);
        }
    }

    public function removeUser($user)
    {
        if (!this->getUsers()->contains($user)) {
            return;
        } else {
            $this->getUsers()->removeElement($user);
            $user->removeRole($this);
        }
    }
 }

Имейте в виду:

  1. PHP - это НЕОБХОДИМОЕ ОБСЛУЖИВАНИЕ, поэтому внимательно прочитайте документацию.
  2. имена классов должны начинаться с заглавной буквы.
...