我想从ArrayCollection中获取1个元素。我正在使用Symfony 2.7。
例如,我有一个实体活动的集合:
<div class="container">
<table width=100%>
<tr>
<td>
<table width="100%" border="0" cellpadding="1" cellspacing="2" class="taborder">
<tr>
<td height=25 align="left" class="gtab">Your Contact Details</td>
</tr>
<tr align="left">
<td colspan="2" valign="top" class="content">
<table width="100%" border="0" align="center" cellpadding="5" cellspacing="1" class="link">
<tr>
<td width="224" height="29" bgcolor="#DEECF5"> <div align="right"><font color="#FF0000">*</font>
<form class="form-horizontal">
<div class="form-group">
<b>Title :</b></div></td>
<td width="326" bgcolor="#DEECF5">
<select name="gender" >
<option <? if ($dataary['gender']=="Mr.") echo "selected"; ?>
</option> <option value="Mr">Mr</option>
<option <? if ($dataary['gender']=="Mrs.") echo "selected"; ?>
</option> <option value="Mrs">Mrs.</option>
<option <? if ($dataary['gender']=="Ms.") echo "selected"; ?>
</option> <option value="Ms">Ms</option>
</select>
</td>
</div>
</tr>
<tr>
<td width="224" height="29" bgcolor="#DEECF5"> <div align="right"><font color="#FF0000">*</font>
<form class="form-inline">
<div class="row">
<div class="col-xs-3">
<b> <label for="lnm">Full Name :</label></b></div></td>
<td width="326" bgcolor="#DEECF5">
<div class="row">
<div class="col-sm-3">
<div class="form-group">
<input type="text" size="10" name="fnm" class="form-control" value="<?php print $dataary['fnm'];?>">
</div>
</div>
<div class="col-sm-3">
<div class="form-group">
<input type="text" size="10" name="lnm" class="form-control" value="<?php print $dataary['lnm'];?>">
</div>
</div>
</div>
<br>
<?php print $errors['fullname']; ?>
</td>
</div>
</div>
</form>
</tr>
接下来,我想根据多对一关系从这个ArrayCollection中获取1个活动。
实体'活动':
$activities = $em->getRepository('AppBundle:Activity')->findAll();
我尝试了什么:
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\ActivityRepository")
* @ORM\Table(name="activity")
*/
class Activity {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="ObjectElementTask", inversedBy="activities", cascade={"persist"})
* @ORM\JoinColumn(name="objectelementtask_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $objectelementtask;
我收到以下异常: “在数组”
上调用成员函数findBy()我想阻止查询数据库foreach。
我也尝试过:
$objectElementTask = $em->getRepository('AppBundle:ObjectElementTask')->findOneBy(["active" => 1, "object" => (int)$objectId]);
$activity = $activities->findBy(['objectelementtask' => $objectElementTask]);
但这没有结果......
提前致谢!
答案 0 :(得分:1)
我可以在这里看到几件事。
1)Doctrine查询返回的数组不是ArrayCollection。 (this solution)。这就是为什么你在findBy上得到错误的原因。 (我甚至不认为ArrayCollection有一个findBy方法。这是API而我看不到它:https://stackoverflow.com/a/8237943/7745506)如果这是一个ArrayCollection,你或许可以使用它过滤方法:http://www.doctrine-project.org/api/common/2.3/class-Doctrine.Common.Collections.ArrayCollection.html
2)如果您的Activity类与ObjectElementTask类具有ManyToOne关系,那么根据定义,对ObjectElementTask的Activity的任何搜索都有可能返回许多活动。
3)你说你不想在foreach中查询数据库而你不需要。
在这种情况下你可以做的是查询数据库中所有活动(由于上面的第2项,它有可能是多个),用于特定的ObjectElementTask。
$objectElementTask = $em->getRepository('AppBundle:ObjectElementTask')->findOneBy(["active" => 1, "object" => (int)$objectId]);
$activities = $em->getRepository('AppBundle:Activity')->findBy(['objectelementtask' => $objectElementTask]);
这将返回具有ObjectElementTask作为其objectelementtask的所有活动。你必须在那之后想出你想要的WHICH Activity,因为这将是一个数组。