如何在学说中使用多对多关系中的界面?
在我的应用程序中有3个实体:用户,汽车和驱动程序。用户可以添加汽车和司机作为收藏夹。所以我做了这个结构(简化):
用户,有最喜欢的功能:
namespace Acme\AppBundle\Entities;
use Acme\AppBundle\Interfaces\HasFavorites;
/** @ORM\Entity */
class User implements HasFavorites
{
/** @ORM\ManyToMany(targetEntity="Acme\AppBundle\Entities\Favorite") */
protected $favorites;
public function getFavorites() : ArrayCollection
{
return $this->favorites;
}
public function addFavorite(Favorite $favorite)
{
$this->favorites->add($favorite);
}
}
最喜欢的对象模型:
namespace Acme\AppBundle\Entities;
use Acme\AppBundle\Interfaces\Favoritable;
/** @ORM\Entity */
class Favorite
{
/** @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entities\User") */
private $owner;
/** @ORM\ManyToOne(targetEntity="Acme\AppBundle\Interfaces\Favoritable") */
private $target;
public function __construct(User $owner, Favoritable $target)
{
$this->owner = $owner;
$this->target = $target;
}
public function getOwner() : User
{
return $this->owner;
}
public function getTarget() : Favoritable
{
return $this->target;
}
}
汽车和司机 - 可添加到收藏夹的实体:
namespace Acme\AppBundle\Entities;
use Acme\AppBundle\Interfaces\Favoritable;
/** @ORM\Entity */
class Car implements Favoritable { /* ... */ }
/** @ORM\Entity */
class Driver implements Favoritable { /* ... */ }
但是当我使用命令./bin/console doctrine:schema:update --force
更新我的架构时,我会收到错误
[Doctrine\Common\Persistence\Mapping\MappingException]
Class 'Acme\AppBundle\Interfaces\Favoritable' does not exist
我的测试中的这段代码也正常工作(如果我不使用数据库),所以命名空间和文件路径是正确的:
$user = $this->getMockUser();
$car = $this->getMockCar();
$fav = new Favorite($user, $car);
$user->addFavorite($fav);
static::assertCount(1, $user->getFavorites());
static::assertEquals($user, $fav->getUser());
如何做这种关系?我在搜索中发现的只是当汽车/司机大部分都是逻辑相同时的情况。
我在数据库中需要的只是这样的东西(需要),但它并不那么重要:
+ ––––––––––––– + + ––––––––––––– + + –––––––––––––––––––––––––––––––––– +
| users | | cars | | favorites |
+ –– + –––––––– + + –– + –––––––– + + –––––––– + ––––––––– + ––––––––––– +
| id | name | | id | name | | owner_id | target_id | target_type |
+ –– + –––––––– + + –– + –––––––– + + –––––––– + ––––––––– + ––––––––––– +
| 42 | John Doe | | 17 | BMW | | 42 | 17 | car |
+ –– + –––––––– + + –– + –––––––– + + –––––––– + ––––––––– + ––––––––––– +
答案 0 :(得分:0)
不确定如何生成架构,但我认为接口不在范围内。
添加您用于生成的命令,以便可以重现。
<强>更新强>
除非Favoritable是数据库表,否则这将不起作用
@ORM\ManyToOne(targetEntity="Acme\AppBundle\Interfaces\Favoritable")
我建议在用户中映射汽车和驾驶员实体,然后从中实施getFavorites将返回汽车和/或驾驶员。
这应该让你去
/** @ORM\ManyToOne(targetEntity="Acme\AppBundle\Entities\Car" mappedBy="favorites" ????) */
private $favoriteCars;
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html
答案 1 :(得分:0)
看起来你在Annotation中缺少JoinColumns语句:
** @ORM \ ManyToOne(targetEntity =“Acme \ AppBundle \ Entities \ User”)* /
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="owner_id", referencedColumnName="id")
* })
答案 2 :(得分:0)
使用Doctrine的ResolveTargetEntityListener
,您可以按照您的方式注释目标 interface 的关系,然后将其解析为特定实体。
Doctrine docs中的更多内容:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/resolve-target-entity-listener.html
或者在这里,如果你正在使用Symfony框架:http://symfony.com/doc/current/doctrine/resolve_target_entity.html
然而,你无法通过这种方式实现你想要的东西 - 一个界面被解析为使用&#34;鉴别器&#34;实现这个界面的多个实体。这不可能是AFAIK。您只能将一个接口解析为一个实体,以便在一个表中使用。