- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,欢迎光临 Stackoverflowers?花朵?!没关系:)
不久前,我开始深入学习 Symfony3,到目前为止,您在这里提出的问题对我来说已经足够了。但今天这一天到来了,我个人有一个问题。
那么让我们勾勒一下情况:
我正在为我的小型 CMS 开发一个简单的标记功能。我希望我的文章(可能还有其他内容)包含我附加的一些标签。为了做到这一点,我用 Doctrine 创建了一组两个对象:Article 和 Tag(下面有一些代码):
文章模型
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Article
*
* @ORM\Table(name="article")
* @ORM\Entity(repositoryClass="AppBundle\Repository\ArticleRepository")
*/
class Article extends ContentItem
{
/**
* @var string
*
* @ORM\Column(name="content", type="text")
*/
private $content;
/**
*
* @ORM\ManyToOne(targetEntity="ContentTypeDict", inversedBy="articles")
* @ORM\JoinColumn(name="type_id", referencedColumnName="id", nullable=false)
*/
private $type;
/**
* @ORM\ManyToMany(targetEntity="Tag", inversedBy="articles")
* @ORM\JoinTable(name="tags_of_articles")
*/
protected $tags;
public function __construct()
{
$this->tags = new ArrayCollection();
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set type
*
* @param boolean $type
*
* @return Article
*/
public function setType($type)
{
$this->type = $type;
return $this;
}
/**
* Get type
*
* @return bool
*/
public function getType()
{
return $this->type;
}
/**
* Set content
*
* @param string $content
*
* @return Article
*/
public function setContent($content)
{
$this->content = $content;
return $this;
}
/**
* Get content
*
* @return string
*/
public function getContent()
{
return $this->content;
}
/**
* Add tag
*
* @param \AppBundle\Entity\tag $tag
*
* @return Article
*/
public function addTag(\AppBundle\Entity\tag $tag)
{
$this->tags[] = $tag;
return $this;
}
/**
* Remove tag
*
* @param \AppBundle\Entity\tag $tag
*/
public function removeTag(\AppBundle\Entity\tag $tag)
{
$this->tags->removeElement($tag);
}
/**
* Get tags
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getTags()
{
return $this->tags;
}
}
标签模型
namespace AppBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* Tag
*
* @ORM\Table(name="tag")
* @ORM\Entity(repositoryClass="AppBundle\Repository\TagRepository")
*/
class Tag
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255, unique=true)
*/
private $name;
/**
* @var int
*
* @ORM\Column(name="popularity", type="integer")
*/
private $popularity;
/**
*
* @ORM\ManyToMany(targetEntity="Article", mappedBy="tags")
*/
private $articles;
/**
*
* @ORM\ManyToMany(targetEntity="Asset", inversedBy="tags")
* @ORM\JoinTable(name="assets_tags")
*/
private $assets;
public function __construct()
{
$this->articles = new ArrayCollection();
$this->assets = new ArrayCollection();
}
/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Tag
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set popularity
*
* @param integer $popularity
*
* @return Tag
*/
public function setPopularity($popularity)
{
$this->popularity = $popularity;
return $this;
}
/**
* Get popularity
*
* @return int
*/
public function getPopularity()
{
return $this->popularity;
}
/**
* Add content
*
* @param \AppBundle\Entity\ContentItem $content
*
* @return Tag
*/
public function addContent(\AppBundle\Entity\ContentItem $content)
{
$this->content[] = $content;
return $this;
}
/**
* Remove content
*
* @param \AppBundle\Entity\ContentItem $content
*/
public function removeContent(\AppBundle\Entity\ContentItem $content)
{
$this->content->removeElement($content);
}
/**
* Get content
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getContent()
{
return $this->content;
}
/**
* Add article
*
* @param \AppBundle\Entity\ContentItem $article
*
* @return Tag
*/
public function addArticle(\AppBundle\Entity\ContentItem $article)
{
$this->articles[] = $article;
return $this;
}
/**
* Remove article
*
* @param \AppBundle\Entity\ContentItem $article
*/
public function removeArticle(\AppBundle\Entity\ContentItem $article)
{
$this->articles->removeElement($article);
}
/**
* Get articles
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getArticles()
{
return $this->articles;
}
/**
* Add asset
*
* @param \AppBundle\Entity\ContentItem $asset
*
* @return Tag
*/
public function addAsset(\AppBundle\Entity\ContentItem $asset)
{
$this->assets[] = $asset;
return $this;
}
/**
* Remove asset
*
* @param \AppBundle\Entity\ContentItem $asset
*/
public function removeAsset(\AppBundle\Entity\ContentItem $asset)
{
$this->assets->removeElement($asset);
}
/**
* Get assets
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getAssets()
{
return $this->assets;
}
}
这些对象是相关的,正如您所看到的那样,ManyToMany 与名为 'tags_of_articles' 的表存在关联
现在有了这两个对象,我希望能够通过提供一个标签或(也许稍后)一堆标签来获得一篇文章。
为此,我在 ArticleController 中编写了一个简短的函数
/**
* @Route("/showArticlesByTag/{tag}")
*/
public function showArticlesByTag($tag)
{
$em = $this->getDoctrine()->getManager();
$tagRepo = $em->getRepository('AppBundle:Tag');
$tagData = $tagRepo->findOneBy(array('name' => $tag,));
$dataRepo = $em->getRepository('AppBundle:Article');
$data = $dataRepo->findOneBy(array('tags' => $tagData->getId(),));
var_dump($data);
//return $this->render('AppBundle:Article:show_article.html.twig', array( ));
}
作为执行的结果,比方说
localhost/~user/MyCMS/web/app_dev.php/showArticlesByTag/Architecto
(标记表中存在标记 Architecto)
我得到一个异常(exception):
An exception occurred while executing 'SELECT t0.content AS content_1, t0.id AS id_2, t0.title AS title_3, t0.description AS description_4, t0.enabled AS enabled_5, t0.type_id AS type_id_6 FROM article t0 WHERE tags_of_articles.tag_id = ? LIMIT 1' with params [3]:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tags_of_articles.tag_id' in 'where clause'
在最后,我附上了 SQL 中的表结构:
- --------------------------------------------------------
--
-- Table structure for table `article`
--
CREATE TABLE IF NOT EXISTS `article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type_id` int(11) NOT NULL,
`content` longtext COLLATE utf8_unicode_ci NOT NULL,
`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`description` longtext COLLATE utf8_unicode_ci NOT NULL,
`enabled` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
KEY `IDX_23A0E66C54C8C93` (`type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
-- --------------------------------------------------------
--
-- Table structure for table `tag`
--
CREATE TABLE IF NOT EXISTS `tag` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`popularity` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_389B7835E237E06` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;
-- --------------------------------------------------------
--
-- Table structure for table `tags_of_articles`
--
CREATE TABLE IF NOT EXISTS `tags_of_articles` (
`tag_id` int(11) NOT NULL,
`article_id` int(11) NOT NULL,
KEY `IDX_D429AC71BAD26311` (`tag_id`),
KEY `IDX_D429AC717294869C` (`article_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
现在的问题是:我做错了什么?或者,我在这里错过了什么?
最佳答案
可能还有其他方法可以实现这一点,但我会通过向您的 ArticleRepository 添加方法 findByTags
来实现:
像这样向您的 ArticleRepository 添加一个方法(您没有自定义存储库?请检查:Custom Repository Classes):
class ArticleRepository extends EntityRepository
{
// ...
public function findyByTags(array $tags)
{
$qb = $this->createQueryBuilder('a');
$qb->join('a.tags', 't');
for($i = 0; $i < count($tags); $i++) {
$qb->andWhere($qb->expr()->eq('t.name', ':tag' . $i));
$qb->setParameter('tag' . $i, $tags[$i]);
}
return $qb->getQuery()->getResult();
}
}
在你的 Controller 中你可以像这样使用它:
public function showArticlesByTag($tag)
{
$dataRepo = $this->getDoctrine()->getRepository('AppBundle:Article');
$data = $dataRepo->findByTags(array($tag));
// ...
}
如果您将多个标签传递给此方法,则一篇文章必须包含所有标签才能返回。这段代码可能有错误,因为我当然无法测试它。但我希望它能表达我的观点。 ;-)
关于php - Symfony3 多对多关联查询中的 Doctrine2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36195677/
我想知道存储库在 Doctrine 中意味着什么? 有人可以解释一下吗? 最佳答案 许多 ORM(对象关系映射器)使用的术语“存储库”, Doctrine 只是其中之一。 它意味着可以从数据存储库访问
我尝试使用 进行数据库查询 $position = $repository->findBy( array('id' => $profileId,'datum' => '10.07.2011')
几个月前,有一个命令可以将 Doctrine 1 架构文件转换为 Doctrine 2 实体,但是,该命令不再存在。 我刚刚开始使用 Symfony2 RC1。 有没有被删除的原因?我有一个 600
我有一个实体,称为 Stones,Stones 与 Attributes 有 ManyToMany 关系。 所以我查询实体以获取石头,然后将其水化以将其转换为数组。 $result = $t
我在 zend 框架 2 中使用了学说 2。要使用数据库表生成实体,使用的控制台命令是: php doctrine-module orm:convert-mapping --force --from-
我需要一个具体的代码示例,其中包含使用“多态关联”的 Doctrine 2。 让我澄清一下自己。我有一个名为 Contract 的实体,一个契约(Contract)可以有许多价格规则,这些价格规则可以
我知道条件过滤器尚不可用于查询(根据 Doctrine2 手册已知限制部分中的“26.1.4. Applying Filter Rules to any Query”),所以我想问问专家他们首选的解决
我在所有网络上搜索..但没有找到这个问题的回复。为了记录我的项目实体中的更改,我想使用 stof 条令扩展 - 可记录,但对我来说并不明显,实体的更改如何存储在数据库中?我可以定义我自己的历史表并在那
我使用两个类: namespace Test; use Doctrine\ORM\Mapping as ORM; /** *@Table() *@InheritanceType("Joined")
A previous question I asked与使用 Doctrine 和查询生成器时对结果集进行水化有关。我的问题是如何返回数组及其子集: 这是针对单个结果集的,答案很简单: $qb
我有两个实体 User和 Article多对多关系为 Article可以有很多作者。 class User { /** @var string */ public $name;
我有一个看起来像这样的查询: 我的用户实体具有如下所示的一对一关系: /** * @var UserProfile * * @ORM\OneToOne(targetEntity="UserPro
我最近正在阅读Doctrine 2's best practices并被此阻止: 25.3. Avoid composite keys Even though Doctrine fully suppo
如何在服务容器中使用 Doctrine? 该代码只会导致错误消息“ fatal error :调用未定义的方法 ...::get()”。 em = $em; } public func
向一条记录加载 Doctrine 的首选方式是什么? 我正在使用 $em = EntityManager::create($connectionOptions, $config); $dql = "s
我正在使用 Doctrine,并且想要记录所有生成的 SQL 查询。 我知道我可以使用 $q->getSqlQuery() 但我不想每次都手动执行此操作。 有没有办法自动完成? 最佳答案 如果您打开日
如何在 Doctrine 中找到分组最大值或包含最大值的行?在 SQL 中,我通常会使用自连接来执行此操作,如 here 中所述。 . 虽然可以在 Doctrine 中建立 self 关系,但有更好的
我在谷歌上浪费了数万亿个小时,但没有一个解决方案是好的。 我有这个查询生成器: $qb2=$this->createQueryBuilder('s') ->addSel
我有以下问题: 实体具有经典的创建/更新时间戳字段,应将其设置为 UTC 中的当前时间戳。 在实体上,我使用 columnDefinition 属性将它们设置为 "TIMESTAMP NOT NULL
我需要从多个相关表中执行 DQL 删除。 在 SQL 中,它是这样的: DELETE r1,r2 FROM ComRealty_objects r1, com_realty_objects_p
我是一名优秀的程序员,十分优秀!