学说,多对多关系问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学说,多对多关系问题相关的知识,希望对你有一定的参考价值。

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

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 OR MANY_TO_MANY之一

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

用户实体

/**
 * User
 *
 * @ORMTable(name="user")
 * @ORMEntity(repositoryClass="AppBundleRepositoryUserRepository")
 * @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
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;

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


    /**
     * @ORMManyToMany(targetEntity="AppBundleEntityCatalog", inversedBy="user")
     * @ORMJoinTable(name="user_catalog",
     *     joinColumns={@ORMJoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORMJoinColumn(name="catalog_id", referencedColumnName="id")} )
     */
    protected $catalogs;

    /**
     * @ORMOneToMany(targetEntity="AppBundleEntityCatalog", mappedBy="user")
     */
    protected $catalog;

目录实体

/**
 * Catalog
 *
 * @ORMTable(name="catalog")
 * @ORMEntity(repositoryClass="AppBundleRepositoryCatalogRepository")
 */
class Catalog
{
    /**
     * @var int
     *
     * @ORMColumn(name="id", type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * @ORMManyToOne(targetEntity="AppBundleEntityUser", inversedBy="catalog")
     * @ORMJoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;


    /**
     * @ORMManyToMany(targetEntity="AppBundleEntityUser", mappedBy="catalog")
     */
    protected $users;





    /**
     * Constructor
     */
    public function __construct()
    {
        $this->users = new DoctrineCommonCollectionsArrayCollection();
        $this->user = new DoctrineCommonCollectionsArrayCollection();

    }
答案

在您的用户实体中:

/**
 * @ORMManyToMany(targetEntity="AppBundleEntityCatalog", inversedBy="users")
 * @ORMJoinTable(name="user_catalog",
 *     joinColumns={@ORMJoinColumn(name="user_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORMJoinColumn(name="catalog_id", referencedColumnName="id")} )
 */
protected $catalogs;

在您的目录实体中:

 /**
 * @ORMManyToMany(targetEntity="AppBundleEntityUser", mappedBy="catalogs")
 */
protected $users;

以上是关于学说,多对多关系问题的主要内容,如果未能解决你的问题,请参考以下文章

学说,多对多关系问题

学说:在自引用中删除实体(多对多)

学说:具有复合键的实体之间的 ManyToX 关系

关系数据库中的作者、文章、杂志关系 [学说]

学说收集标准 isNull

了解学说级联操作