我有以下關系
/**
* @ORM\Column(type="string", length=255)
*/
private $image_name;
/**
* @ORM\OneToMany(targetEntity=Tags::class, mappedBy="image",cascade={"persist"})
*/
private $tags;
和
/**
* @ORM\Column(type="string", length=255)
*/
private $tag_name;
/**
* @ORM\ManyToOne(targetEntity=Image::class, inversedBy="tags")
*/
private $imageStock;
在我的搜索表單中,當我需要進行搜索時,我必須獲得與搜索輸入匹配的影像。搜索是通過影像名稱或標簽名稱完成的。我有下表。
圖片
id|image_name
1|Spider Man
標簽
id|tag_name |image_id
1|Spider Man|1
2|Movie |1
3|Xyz |1
我很困惑如何在 Repository 中進行查詢。
這是我嘗試過的:
$query = $this->getEntityManager()->createQueryBuilder('ca1')
->add('select', 'c, i')
->add('from', 'App:Image c')
->leftJoin('c.tags', 'i')
->where('c.image_name = :search_name')
->orderBy('c.id', 'ASC')
->setParameters([
'search_name' => "%$search_name%",
])
->getQuery();
return $query->getResult();
uj5u.com熱心網友回復:
如果在影像存盤庫中,它將是這樣的:
$qb = $this->createQueryBuilder('c')
->leftJoin('c.tags', 'i')
->orderBy('c.id', 'ASC')
;
return $qb
->andWhere(
$qb->expr()->orX(
$qb->expr()->like('c.image_name', ':search_name'),
$qb->expr()->like('i.tag_name', ':search_name'),
)
)
->setParameter('search_name', "%$search_name%")
->getResult()
;
并且最好遵循camelCase 來獲取$imageName和等引數$tagName;
uj5u.com熱心網友回復:
你必須使用LIKE而不是=:
/** @var Image[] $images */
$images = $this->getEntityManager()
->createQueryBuilder()
->from(Image::class, 'image')
->select('image')
->leftJoin('image.tags', 'imtag')
->addSelect('imtag') // Optional, use only if you want to access tags.
->where('image.image_name LIKE :search_name')
->orWhere('imtag.tag_name LIKE :search_name')
->setParameter('search_name', "%$search_name%")
->orderBy('image.id', 'ASC')
->getResult()
;
- Doctrine 查詢構建器被決議為
DQL,您可以在查詢構建器上檢索DQLviagetDQL()。 - 您可以
SQL在 Symfony profilerDoctrine部分查看執行的查詢。 - 正如評論中提到的,一開始寫起來更容易
SQL,然后DQL.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/362819.html
