如何在教條中以多對多的關係使用界面?學說ORM:使用接口作爲不同實體的關係?
在我的應用程序中有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 |
+ –– + –––––––– + + –– + –––––––– + + –––––––– + ––––––––– + ––––––––––– +
我更新了關於命令和簡單測試(無需觸摸數據庫或實體管理器)的更多信息。 – trogwar
猜測教義(也許?)希望真正的類或抽象類作爲targetEntity使用,但需要接口。我不能從一個抽象類繼承Car和Driver,因爲它們是非常不同的實體。 – trogwar