接收与Doctrine2和Symfony2的多对多关系的实体



我有两个实体:

调用实体:

/**
* @ORMTable(
*        name="calls",
* )
* @ORMEntity(repositoryClass="AppBundleEntityRepositoriesCallRepository")
*/
class Call implements JsonSerializable
{
/**
* @var integer
*
* @ORMColumn(type="integer", nullable=false)
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
*/
public $id;
/**
* @var User
* @ORMManyToOne(targetEntity="User", cascade={"all"})
* @ORMJoinColumn(name="user_id", referencedColumnName="id", onDelete="cascade")
*/
public $user;
/**
* Many Calls have Many Tags.
* @ORMManyToMany(targetEntity="Tag", mappedBy="taggedCalls", fetch="EAGER")
*/
public $tags;
/**
* @var string
* @ORMColumn(type="string", length=40, nullable=false)
*/
public $phone;
public function __construct(User $user)
{
$this->user = $user;
$this->tags = new ArrayCollection();
}
public function jsonSerialize()
{
$call = [
'id' => $this->id,
'phone' => $this->phone,
'tags' => [],
];
foreach ($this->tags as $tag) {
$author['books'][] = $tag->jsonSerialize();
}
return $call;
}
/**
* @return ArrayCollection|Tag[]
*/
public function getTags()
{
return $this->tags;
}
public function addNewTag($tag)
{
if ($this->tags->contains($tag)) return;
$this->tags[] = $tag;
}
}

标记实体:

/**
* @ORMTable(name="tags",
*     uniqueConstraints={@ORMUniqueConstraint(name="tag_value", columns={"value"})})
* @ORMEntity()
*/
class Tag implements JsonSerializable
{
/**
* @var integer
*
* @ORMColumn(type="integer", nullable=false)
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
*/
public $id;
/**
* @var string
* @ORMColumn(type="string", length=120, nullable=false)
*/
public $value;
/**
* @ORMManyToMany(targetEntity="Call", inversedBy="tags")
* @ORMJoinTable(name="calls_tags",
*      joinColumns={@ORMJoinColumn(name="call_id", referencedColumnName="id")},
*      inverseJoinColumns={@ORMJoinColumn(name="tag_id", referencedColumnName="id")}
*      )
*/
private $taggedCalls;

public function __construct($value)
{
$this->color = $color;
}

public function getId()
{
return $this->id;
}
public function getValue()
{
return $this->value;
}
public function setValue($value)
{
$this->value = $value;
}

function jsonSerialize()
{
return [
'id' => $this->id,
'value' => $this->value,
];
}
}

以及用于接收具有相应标签数组的Call实体数组的 REST 控制器:

/**
* @Route("/calls", name="my_v1_calls")
* @Method("GET")
*/
public function calls(Request $request)
{
$this->recordLog($request);
$user = $this->authorizeUser($request);
$qb = $this->callRepository->createQueryBuilder('c');
$qb->where("c.user = :user")->setParameter("user", $user);
$limit = $request->query->get("limit", 500);
if ($limit < 1 || $limit > 500)
$limit = 500;
$qb->setMaxResults($limit);
$calls = $qb->getQuery()->getResult();
$serializedCalls = [];
foreach ($calls as $call) {
$serializedCalls[] = $call->jsonSerialize();
}
return new JsonResponse(array(
'calls' => $serializedCalls
));
}

表连接工作正常:添加新标签calls_tags表内创建有效关系。但是我无法接收相应调用的标签:即使数据表中的数据存在且有效,上面显示的控制器代码片段也会为每个调用返回空标签数组。我错过了什么吗?

你认为这部分代码会做什么?

public function jsonSerialize()
{
$call = [
'id' => $this->id,
'phone' => $this->phone,
'tags' => [],
];
foreach ($this->tags as $tag) {
→       $author['books'][] = $tag->jsonSerialize();
}
return $call;
}

如果关联实体实现了JsonSerializable,您可以简单地执行以下操作:

public function jsonSerialize()
{
return [
'id' => $this->id,
'phone' => $this->phone,
'tags' => $this->tags->toArray(),
];
}

最新更新