タイトルがややこしくてすみません。私が求めていることを要約する良い方法が思いつきませんでした。
私が構築しているサイトでは、ページにサブページがあることを許可する必要があります。ページが次のように機能するためのルートを作成しました。
/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 という名前の関連付けがありません