2015-09-21 51 views
0

我正在使用一个树枝来显示元素列表。这些元素来自API的解码json数组。选择一个未实体实体

我有我的用户和这些元素之间的OneToMany关系。

用户需要选择其中一个元素,这些元素将通过addElement()函数添加到用户中。

我试图在循环中使用Symfony2窗体,但它只显示在第一个元素上。我也尝试使用链接到控制器的功能,但因为没有这些元素在我的DB是坚持,我得到这个错误:

"Unable to guess how to get a Doctrine instance from the request information." 

下面是如何显示我的元素:

{% block itinerary %} 
    {% for element in elements %} 

<aside class="flights-results__by-price col-md-3"> 
    <span class="flights-results__price">{{ element.price ? element.price : 'Unknown' }}</span> 
    <a href="{{ path('selectLeg', {'element': element}) }}">Delete</a> 
</aside> 

    {% endfor %} 
{% endblock itinerary %} 

这里是我创建并填写我的元素的功能:

public function getAvailabilities($availabilities, $planes,  $airports) 
{ 
    $reservations = array(); 
    foreach ($availabilities as $ar) 
    { 
     $leg = new Leg(); 
     $leg->getId(); 
     foreach($ar as $a) 
     { 
      $leg = $this->fillLeg($leg, $a); 
      foreach($a->availabilities as $aleg) 
      { 
       $leg->setAirplaneType($this->findPlane($planes, $aleg->airplane_type_id)); 
       $leg->setAirportStart($this->findAirport($airports, $a->lfi_from)); 
       $leg->setAirportEnd($this->findAirport($airports, $a->lfi_to)); 
       $leg->setDurationLeg($aleg->duration); 
       $leg->setEndHour($aleg->datetime_to); 
      } 
      $startdate = $a->datetime; 
     } 
     $reservations[] = $leg; 
    } 
    return $reservations; 
} 

这里是结果,当我转储($元素):

FlightController.php on line 55: 
array:4 [▼ 
    0 => {#953 ▼ 
    +"3e1f975601f59090decc8f2d5ced72010162e48e": {#954 ▼ 
    +"lfi_from": "FR58957" 
    +"lfi_to": "FR45300" 
    +"datetime": "2015-09-10 20:00:00" 
    +"nb_pax": "4" 
    +"availabilities": array:1 [▼ 
    0 => {#955 ▶} 
    ] 
} 
    } 
    1 => {#956 ▼ 
+"3e1f975601f59090decc8f2d5ced72010162e48e": {#957 ▼ 
    +"lfi_from": "FR45300" 
    +"lfi_to": "AG00060" 
    +"datetime": "2015-09-10 23:00:00" 
    +"nb_pax": "4" 
    +"availabilities": array:1 [▼ 
    0 => {#958 ▶} 
    ] 
} 
} 
2 => {#959 ▼ 
+"3e1f975601f59090decc8f2d5ced72010162e48e": {#960 ▼ 
    +"lfi_from": "FR45300" 
    +"lfi_to": "AG00060" 
    +"datetime": "2015-11-30 23:00:00" 
    +"nb_pax": "4" 
    +"availabilities": array:1 [▼ 
    0 => {#961 ▶} 
    ] 
} 
} 
3 => {#962 ▼ 
+"3e1f975601f59090decc8f2d5ced72010162e48e": {#963 ▼ 
    +"lfi_from": "FR45300" 
    +"lfi_to": "OLOLOL" 
    +"datetime": "2015-09-18 23:00:00" 
    +"nb_pax": "2" 
    +"availabilities": array:1 [▼ 
    0 => {#964 ▶} 
    ] 
} 
} 
] 

主要问题是API会返回几千条结果。出于显而易见的原因,我无法坚持所有。

我想问的最简单的方法是“什么是最好的方式发送一个实体上的数据到另一个功能在我的控制器,没有坚持这个实体?”。到目前为止,我一直使用持久化元素,用id作为标识符,但是当我们处理非持久化实体时,我意识到它变得更加棘手。

+0

你可以分享一些代码,以便我们可以看到你想要实现的目标吗? – tchap

+0

完成后,我添加了for循环,以及我之前尝试的链接。 –

+0

...但我们仍然错过了有用的代码:你在哪里创建你的JSON?元素的价值是什么?你的实体是什么?另外,你的Twig模板中的'l'不会引用任何内容;循环变量似乎是'元素'... – tchap

回答

0

如果您有一个OneToMany您的User与这些Elements之间的关系,这意味着Elements以某种方式持续存在。那么为什么你不能使用元素的id

在你坚持下去它的情况下,你可能需要在控制器代码添加ParamConverter沿着这些线路的地方:

/** 
    * @Route("/selectLeg/{element}") 
    * @ParamConverter("element", class="YourBundle:Element", options={"mapping": {"name": "element.whatever_param"}}) 
    * @Template() 
    */ 
public function selectLegAction(Element $element) 

事实是,如果Symfony2的不知道你的Element实体,您将无法对User执行addElement()

我猜的是你在前端得到元素列表,然后尝试更新User对象。在您的控制器

<a href="{{ path('selectLeg', {'legAsJSONString': element|json_encode}) }}">Select this leg</a> 

,并创建一个新的Element:在这种情况下,我会json_encode你的元素在枝条(这毕竟是我的理解一个简单的数组)

/** 
    * @Route("/selectLeg/{legAsJSONString}") 
    */ 
public function selectLegAction($legAsJSONString) { 

    $e = json_decode($legAsJSONString); 

    $leg = new Leg(); 
    $leg->setWhateverParameter($e->parameter_in_the_array); 
    // more parameters here 
    $em->persist($leg)->flush(); 

    /// Now here you have $leg->getId(); if ever you need it 

} 

编辑:改编发表您的评论。如果您不需要在用户选择特定元素之前保留元素(支线),则以GET参数,路径参数或POST的数据以字符串形式发送该元素请求(清洁解决方案)。你不需要id,因为你可以在请求中传递完整的对象,作为JSON字符串。

getAvailabilities()中删除无用的$leg->getId();,它实际上并没有做任何事情,而且ID也不存在。

如果我错过了这一点,而且$leg对象太复杂,因此在JSON序列化没有,那么你将需要坚持它,因为两个相继的请求将需要访问它。

+0

谢谢你的回答。我试过你的解决方案,仍然面临同样的问题:没有坚持我的实体,我不能得到一个标识符来生成路线。我添加了其余的代码,并且改变了问题以使其尽可能清楚。 –

+0

查看我的更新回答。对我而言,通过POST或GET发送完整对象是您的最佳解决方案,因为该对象看起来是可序列化的。那么你不需要标识符。如果你不能这样做,你**将需要**坚持你的腿之间的两个请求... – tchap

+0

我试着用你的更新的答案,我可以发送的元素,但由于某种原因,JSON是空的。但是,我试图在枝编码之前转储元素,它已满。尽管我不知道为什么它被清除,但我认为我正在为我的问题找到正确的方向。 –