学说,多对多关系问题

时间:2018-01-02 20:43:07

标签: mysql symfony doctrine-orm doctrine many-to-many

我有实体:用户和目录,相关关系(如下)。用户可以创建目录,然后可以与其他用户共享。我想搜索分配给用户的所有目录(即他自己创建的目录和可供他使用的目录)。

public function findAllCatalogForUser($id){
    return $this->createQueryBuilder('catalog')
        ->leftJoin('catalog.users','us')
        ->innerJoin('catalog.user','u')
        ->where('u.id = :id OR us.id =:id ') 
        ->setParameters([':id'=>$id])
        ->getQuery()
        ->getResult();
}

但是,执行查询时,会收到错误

关联类型必须是_TO_ONE或MANY_TO_MANY

之一

在我看来,表之间的关系是正确的,但我无法进行查询。 如何解决这个问题?提前感谢您的回答。

用户实体

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 * @UniqueEntity(fields="email", message="Ten email już istnieje, musisz użyć innego.")
 * @UniqueEntity(fields="username", message="Nazwa użytkownika już istnieje, musisz użyć innej.")
 */
class User implements AdvancedUserInterface, \Serializable
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="username", type="string", length=255, unique=true)
     * @Assert\NotBlank(message="Pole nie może być puste!")
     */
    private $username;


    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Catalog", inversedBy="user")
     * @ORM\JoinTable(name="user_catalog",
     *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="catalog_id", referencedColumnName="id")} )
     */
    protected $catalogs;

    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Catalog", mappedBy="user")
     */
    protected $catalog;

目录实体

/**
 * Catalog
 *
 * @ORM\Table(name="catalog")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\CatalogRepository")
 */
class Catalog
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=100)
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="catalog")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;


    /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\User", mappedBy="catalog")
     */
    protected $users;





    /**
     * Constructor
     */
    public function __construct()
    {
        $this->users = new \Doctrine\Common\Collections\ArrayCollection();
        $this->user = new \Doctrine\Common\Collections\ArrayCollection();

    }

1 个答案:

答案 0 :(得分:2)

在您的用户实体中:

/**
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Catalog", inversedBy="users")
 * @ORM\JoinTable(name="user_catalog",
 *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="catalog_id", referencedColumnName="id")} )
 */
protected $catalogs;

在目录实体中:

 /**
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\User", mappedBy="catalogs")
 */
protected $users;