繁体   English   中英

Doctrine&Symfony2连接多个表

[英]Doctrine & Symfony2 join multiple tables

我一直在努力在DQL中进行多重联接。 这是我的代码:

    $query = $em->createQuery(
        'SELECT k
         FROM AppBundle:Keyword k
         JOIN k.company c
         JOIN k.entry e
         WHERE c.user = :id
         ORDER BY k.name ASC'
    )->setParameter('id',$user_id);

但是在执行它时会给我“通知:未定义的索引:条目”。

这是我的关键字实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Keyword
*/
class Keyword
{
/**
 * @var integer
 */
private $id;

/**
 * @var string
 */
private $name;


/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set name
 *
 * @param string $name
 * @return Keyword
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

/**
 * Get name
 *
 * @return string 
 */
public function getName()
{
    return $this->name;
}
/**
 * @var \Doctrine\Common\Collections\Collection
 */
private $user;

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

/**
 * Add user
 *
 * @param \AppBundle\Entity\User $user
 * @return Keyword
 */
public function addUser(\AppBundle\Entity\User $user)
{
    $this->user[] = $user;

    return $this;
}

/**
 * Remove user
 *
 * @param \AppBundle\Entity\User $user
 */
public function removeUser(\AppBundle\Entity\User $user)
{
    $this->user->removeElement($user);
}

/**
 * Get user
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getUser()
{
    return $this->user;
}

/**
 * Set user
 *
 * @param \AppBundle\Entity\User $user
 * @return Keyword
 */
public function setUser(\AppBundle\Entity\User $user = null)
{
    $this->user = $user;

    return $this;
}
/**
 * @var \Doctrine\Common\Collections\Collection
 */
private $company;


/**
 * Add company
 *
 * @param \AppBundle\Entity\Company $company
 * @return Keyword
 */
public function addCompany(\AppBundle\Entity\Company $company)
{
    $this->company[] = $company;

    return $this;
}

/**
 * Remove company
 *
 * @param \AppBundle\Entity\Company $company
 */
public function removeCompany(\AppBundle\Entity\Company $company)
{
    $this->company->removeElement($company);
}

/**
 * Get company
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getCompany()
{
    return $this->company;
}

/**
 * Set company
 *
 * @param \AppBundle\Entity\Company $company
 * @return Keyword
 */
public function setCompany(\AppBundle\Entity\Company $company = null)
{
    $this->company = $company;

    return $this;
}
/**
 * @var \Doctrine\Common\Collections\Collection
 */
private $entry;


/**
 * Add entry
 *
 * @param \AppBundle\Entity\Entry $entry
 * @return Keyword
 */
public function addEntry(\AppBundle\Entity\Entry $entry)
{
    $this->entry[] = $entry;

    return $this;
}

/**
 * Remove entry
 *
 * @param \AppBundle\Entity\Entry $entry
 */
public function removeEntry(\AppBundle\Entity\Entry $entry)
{
    $this->entry->removeElement($entry);
}

/**
 * Get entry
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getEntry()
{
    return $this->entry;
}
/**
 * @var \Doctrine\Common\Collections\Collection
 */
private $ranking;


/**
 * Add ranking
 *
 * @param \AppBundle\Entity\Ranking $ranking
 * @return Keyword
 */
public function addRanking(\AppBundle\Entity\Ranking $ranking)
{
    $this->ranking[] = $ranking;

    return $this;
}

/**
 * Remove ranking
 *
 * @param \AppBundle\Entity\Ranking $ranking
 */
public function removeRanking(\AppBundle\Entity\Ranking $ranking)
{
    $this->ranking->removeElement($ranking);
}

/**
 * Get ranking
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getRanking()
{
    return $this->ranking;
}
}

而我的输入实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Entry
 */
class Entry
{
/**
 * @var integer
 */
private $id;

/**
 * @var string
 */
private $path;


/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set path
 *
 * @param string $path
 * @return Entry
 */
public function setPath($path)
{
    $this->path = $path;

    return $this;
}

/**
 * Get path
 *
 * @return string 
 */
public function getPath()
{
    return $this->path;
}

/**
 * @var \AppBundle\Entity\Keyword
 */
private $keyword;


/**
 * Set keyword
 *
 * @param \AppBundle\Entity\Keyword $keyword
 * @return Entry
 */
public function setKeyword(\AppBundle\Entity\Keyword $keyword = null)
{
    $this->keyword = $keyword;

    return $this;
}

/**
 * Get keyword
 *
 * @return \AppBundle\Entity\Keyword 
 */
public function getKeyword()
{
    return $this->keyword;
}
/**
 * @var \Doctrine\Common\Collections\Collection
 */
private $ranking;

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

/**
 * Add ranking
 *
 * @param \AppBundle\Entity\Ranking $ranking
 * @return Entry
 */
public function addRanking(\AppBundle\Entity\Ranking $ranking)
{
    $this->ranking[] = $ranking;

    return $this;
}

/**
 * Remove ranking
 *
 * @param \AppBundle\Entity\Ranking $ranking
 */
public function removeRanking(\AppBundle\Entity\Ranking $ranking)
{
    $this->ranking->removeElement($ranking);
}

/**
 * Get ranking
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getRanking()
{
    return $this->ranking;
}
}

顺便说一句,我对symfony和学说很陌生。 我感谢各种帮助!

您需要为模型类中的每个属性提供映射信息,并为该类提供实体映射。 看看http://doctrine-common.readthedocs.org/en/latest/reference/annotations.html

您的每个模型类都需要@ORM \\ Entity批注,以告诉该学说它是一个映射的实体。 因此,对于您的情况,您将拥有:

/**
* Entry
* @ORM\Entity
*/
class Entry
{
...

然后,要映射到数据库的每个属性都需要一个@ORM \\ Column批注。 例如:

/**
 * @var integer
 * @ORM\Id @ORM\Column @ORM\GeneratedValue
 */
private $id;

/**
 * @var string
 * @ORM\Column(type="string")
 */
private $path;

然后,您需要使用此处http://doctrine-orm.readthedocs.org/en/latest/上的映射之一,为模型之间的任何关系(关键字->公司,关键字->条目等)创建关系映射注释。 reference / association-mapping.html

有了所有正确的映射后,请使用命令行工具app / console doctrine:schema:update来确保模型与数据库同步。

您的DQL看起来不错,因此一旦有了正确的映射,您的运气可能会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM