我是Symfony的新手,所以如果这听起来很愚蠢我会道歉,如果有人纠正我的理解,我真的很感激。
我正在阅读Databases and Doctrine,在阅读时我想为什么不创建一个虚拟的博客应用来练习。
我正在处理的虚拟博客应用程序非常简单,只有三个表及其实体
Entity
是Entity / Post.php,Entity
是实体/评论.php Entity
是实体/类别.php。我能够获得帖子/类别/评论来保存,显示,更新,删除所有正常工作。
我现在正在处理的是显示博客时,其类别显示为数字(类别ID),因此我尝试将帖子表与类别表链接以显示类别名称而不是数字。
问题1 ,由于帖子也与评论表链接,我需要将相同的帖子表与类别表链接,我们可以在Entity/Post.php
内进行此操作吗?
class Post
{
/**
* @ORM\OneToMany(targetEntity="Comments", mappedBy="post")
*/
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="post")
* @ORM\JoinColumn(name="category", referencedColumnName="id")
*/
protected $comment;
protected $categories;
如果没有,那么处理这些关系的正确方法是什么?
问题2 ,在阅读" Fetching Related Objects"时,似乎我应该能够获得以下类别名称
$posts = $this->getDoctrine()->getRepository('BlogBundle:Post')->findBy(array('category' => $id), array('id' => 'DESC'));
$category_name = $posts->getCategory();
但这给了我一个错误
Error: Call to a member function getCategory() on a non-object in
我可以确认getCategory()
实体
Post
方法
我真的很感激这里的任何帮助。
答案 0 :(得分:2)
问题1
注释很好,但你必须将它们写在它们所属的属性之上,否则它们会被忽略:
class Post
{
/**
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post")
*/
protected $comments;
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="posts")
* @ORM\JoinColumn(name="category", referencedColumnName="id")
*/
protected $category;
public function __constructor()
{
$this->comments = new ArrayCollection();
}
// ...
}
让shure在其他实体中设置正确的对应物:
class Category
{
/**
* @ORM\OneToMany(targetEntity="Post", mappedBy="category")
*/
protected $posts;
public function __constructor()
{
$this->posts = new ArrayCollection();
}
// ...
}
class Comment
{
/**
* @ORM\ManyToOne(targetEntity="Post", inversedBy="comments")
* @ORM\JoinColumn(name="post", referencedColumnName="id")
*/
protected $post;
// ...
}
请注意,我更改了一些单数/复数属性和Comments
类名。应该更加直观。
问题2
findBy
返回找到的对象数组,即使只找到一个对象也是如此。在结果中使用findOneBy
或foreach。