Я действительно новичок в Symfony, поэтому заранее прошу прощения, если это звучит глупо, и я буду очень признателен, если кто-нибудь исправит мое понимание.
Я читаю о Базы данных и доктрина и во время чтения я подумала, почему бы не создать фиктивное приложение для блога на практике.
Фиктивное блоговое приложение, над которым я работаю, очень просто, всего три таблицы и его сущность
Entity
это Entity / Post.php, Entity
такое Entity / Comments.phpEntity
такое Entity / Category.php.Я могу получить сообщение / категорию / комментарии, чтобы сохранить, показать, обновить, удалить все, что работает нормально.
Сейчас я работаю над тем, чтобы при отображении блога его категория отображалась в виде числа (идентификатор категории), поэтому я пытаюсь связать таблицу публикаций с таблицей категорий, чтобы отобразить имя категории, а не номер.
Вопрос 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, Во время чтения «Извлечение связанных объектов », кажется, что я должен быть в состоянии получить название категории, делая следующее
$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
юридическое лицо
Я буду очень признателен за любую помощь здесь.
Вопрос 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();
}
// ...
}
Убедитесь, что у вас есть правильный аналог в других объектах:
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
или через ваш результат.
Других решений пока нет …