Поля:
id - ID комментария
user_id - ID пользователя
comment - Текст комментария
type - Тип комментария
foreign_id - Внешний ключ
type Сделать как константы в Entity
class Comment{
const TYPE_BOOK = 1;
const TYPE_AUTHOR = 2;
const TYPE_PUBLISHER = 3;
/**
* @var bigint
*
* @ORM\Column(name="id", type="bigint")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
public $id;
/**
* @var bigint
*
* @ORM\Column(name="user_id", type="bigint")
*/
public $user_id;
/**
* @var string
*
* @ORM\Column(name="comment", type="text")
*/
public $comment;
/**
* @var smallint
*
* @ORM\Column(name="type", type="smallint")
*/
public $type;
/**
* @var bigint
*
* @ORM\Column(name="foreign_id", type="bigint")
*/
public $foreign_id;
}
$comment = new Comment();
$comment->user_id = 37;
$comment->comment = 'комментарий';
$comment->type = Comment::TYPE_BOOK;
$comment->foreign_id = $book->id;
В данном случае у вас не будут связей, но они не особо то и нужны, и можно обойтись без них.
Комментарии же все равно выводятся для книги, автора, издательства.
Т.е. всегда указан type и foreign_id в запросе select.
Если нужно вывести вообще все комментарии, то делаете left join и фильтр: вывести комментарии отдельно по Книгам, авторам и издательствам