0

タイトルがややこしくてすみません。私が求めていることを要約する良い方法が思いつきませんでした。

私が構築しているサイトでは、ページにサブページがあることを許可する必要があります。ページが次のように機能するためのルートを作成しました。

/category/parentName/childName (例: /business/text-elements/links)

ただし、親と子の両方が同じテーブル内に存在するためです。子ページを返すクエリの書き方がわかりません。これが私がこれまでに持っているものです:

public function findByUrlJoinedToSectorAndParent($sector, $pageParent, $pageUrl)
{
    $query = $this->getEntityManager()
        ->createQuery('
            SELECT p, s FROM acmeStyleGuideBundle:PageContent p
            JOIN p.pageSector s
            LEFT JOIN p.pageTypes t
            WHERE p.pageUrl = :url
            AND s.sectorName = :sector
            AND p.PageParent = :parent
            AND t.typeName != :type'
        )
        ->setParameter('url', $pageUrl)
        ->setParameter('sector', $sector)
        ->setParameter('parent', $pageParent)
        ->setParameter('type', 'Section Headers');

    try {
        return $query->getResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}

さて、これは実際に機能します。しかし、それはルートと一致しません。現時点では、子ページを見つけるために、ルートは次のようになっている必要があります。

/category/parentID/childName (例: /business/2/links)

親の名前を受け入れるクエリを作成する方法がわかりません。左結合を使用してこの方法で他のテーブルをクエリしたことがわかりますが、テーブルをそれ自体に結合できるとは思いません。

これが PageContent のエンティティです。

namespace acme\StyleGuideBundle\Entity;

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

/**
 * PageContent
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="acme\StyleGuideBundle\Entity\pageContentRepository")
 */

class PageContent
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
        private $id;

    /**
     * @var ArrayCollection $pageSector_Id;
     * @ORM\ManyToMany(targetEntity="pageSector")
     * @ORM\JoinTable(
     *      name="pageSector_PageContent",
     *      joinColumns={@ORM\JoinColumn(name="PageContent_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="pageSector_Id", referencedColumnName="id")}
     *      )
     */
        protected $pageSector;

    /**
     * @ORM\ManyToOne(targetEntity="pageTypes", inversedBy="PageContent")
     * @ORM\JoinColumn(name="pageTypesId", referencedColumnName="id")
     */
        protected $pageTypes;

    /**
     * @var integer
     *
     * @ORM\Column(name="pageTypesId", type="integer")
     */

        private $pageTypesId;

    /**
     * @ORM\OneToOne(targetEntity="PageContent")
     * @ORM\JoinColumn(name="PageParent", referencedColumnName="id")
     */
        private $PageParent;

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

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

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

    /** Converts string into sluggable url 
    *
    *   @return $text
    */
    public function slugify($text)
    {
        // replace non letter or digits by -
        $text = preg_replace('#[^\\pL\d]+#u', '-', $text);
        $text = trim($text, '-');
        if (function_exists('iconv')) $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
        $text = strtolower($text);
        $text = preg_replace('#[^-\w]+#', '', $text);
        if (empty($text)) return 'n-a';
        return $text;
    }

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

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

    /**
     * Set pageTypesId
     *
     * @param integer $pageTypesId
     *
     * @return PageContent
     */
    public function setPageTypesId($pageTypesId)
    {
        $this->pageTypesId = $pageTypesId;

        return $this;
    }

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


    /**
     * Set pageName
     *
     * @param string $pageName
     *
     * @return PageContent
     */
    public function setPageName($pageName)
    {
        $this->pageName = $pageName;
        $this->setPageUrl($pageName);

        return $this;
    }

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

    /**
     * Set pageUrl
     *
     * @param string $pageUrl
     *
     * @return PageContent
     */
    public function setPageUrl($pageUrl)
    {
        $this->pageUrl = $this->slugify($pageUrl);

        return $this;
    }

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

    /**
     * Set richText
     *
     * @param string $richText
     *
     * @return PageContent
     */
    public function setRichText($richText)
    {
        $this->richText = $richText;

        return $this;
    }

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

    /**
     * Set pageTypes
     *
     * @param \acme\StyleGuideBundle\Entity\pageTypes $pageTypes the setter for page types
     *
     * @return PageContent
     */
    public function setPageTypes(\acme\StyleGuideBundle\Entity\pageTypes $pageTypes = null)
    {
        $this->pageTypes = $pageTypes;

        return $this;
    }

    /**
     * Get pageTypes
     *
     * @return \acme\StyleGuideBundle\Entity\pageTypes 
     */
    public function getPageTypes()
    {
        return $this->pageTypes;
    }

    /**
     * Add pageSector
     *
     * @param \acme\StyleGuideBundle\Entity\pageSector $pageSector
     *
     * @return PageContent
     */
    public function addPageSector(\acme\StyleGuideBundle\Entity\pageSector $pageSector)
    {
        $this->pageSector[] = $pageSector;

        return $this;
    }

    /**
     * Remove pageSector
     *
     * @param \acme\StyleGuideBundle\Entity\pageSector $pageSector
     *
     */
    public function removePageSector(\acme\StyleGuideBundle\Entity\pageSector $pageSector)
    {
        $this->pageSector->removeElement($pageSector);
    }

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

    /**
     * Set pageSectorId
     *
     * @param array $pageSectorId The id of the page sector
     *
     * @return PageContent
     */
    public function setPageSectorId($pageSectorId)
    {
        $this->pageSectorId = $pageSectorId;

        return $this;
    }

    /**
     * Get pageSectorId
     *
     * @return array 
     */
    public function getPageSectorId()
    {
        return $this->pageSectorId;
    }

    /**
     * Set PageParent
     *
     * @param \acme\StyleGuideBundle\Entity\PageParent $PageParent The parent page of this page
     *
     * @return PageContent
     */
    public function setPageParent(\acme\StyleGuideBundle\Entity\PageContent $PageParent = null)
    {
        $this->PageParent = $PageParent;

        return $this;
    }

    /**
     * Get PageParent
     *
     * @return \acme\StyleGuideBundle\Entity\PageParent 
     */
    public function getPageParent()
    {
        return $this->PageParent;
    }

}

実行しようとしているクエリは次のとおりです。

$query = $this->getEntityManager()
            ->createQuery('
                SELECT p, s, c FROM acmeStyleGuideBundle:PageContent p
                JOIN p.pageSector s
                LEFT JOIN p.pageTypes t
                LEFT JOIN p.PageContent c
                WHERE p.pageUrl = :url
                AND s.sectorName = :sector
                AND c.PageParent = :parent
                AND t.typeName != :type'
            )
            ->setParameter('url', $pageUrl)
            ->setParameter('sector', $sector)
            ->setParameter('parent', $pageParent)
            ->setParameter('type', 'Section Headers');

そして、ここに私が得ているエラーがあります。

[Semantical Error] line 0, col 192 near 'c ': エラー: クラス acme\StyleGuideBundle\Entity\PageContent には PageContent という名前の関連付けがありません

4

1 に答える 1

1

問題は私の DQL 構文にあることが判明しました。

 SELECT p, s, c FROM acmeStyleGuideBundle:PageContent p
                JOIN p.pageSector s
                LEFT JOIN p.pageTypes t
                LEFT JOIN p.PageContent c
                WHERE p.pageUrl = :url
                AND s.sectorName = :sector
                AND c.PageParent = :parent
                AND t.typeName != :type'

になるはずだった

SELECT p, s, c FROM acmeStyleGuideBundle:PageContent p
                JOIN p.pageSector s
                LEFT JOIN p.pageTypes t
                LEFT JOIN p.PageParent c
                WHERE p.pageUrl = :url
                AND s.sectorName = :sector
                AND c.pageUrl = :parent
                AND t.typeName != :type'

テーブルをそれ自体に結合していると思っていましたが、実際には列をテーブルに結合していました。今では完全に機能します。

于 2013-09-20T16:03:04.663 に答える