Ключ «имя» для массива с ключами «1, 2» не существует в GirManageParcsBundle: Parcs: manage.html.twig

0

У меня есть этот запрос в SQL:

SELECT count(distinct b.id), count(distinct e.id) FROM building, ensembles e, 'parcs' p WHERE p.id = "1" AND e.parcs_id = p.id AND e.id = b.ensembles_id

Это как я использую этот запрос в моем проекте Symfony, в контроллере ManageController.php:

class ManageController extends Controller
{

    public function indexAction()
    {
        $em=$this->getDoctrine()->getManager();
        $parc = $em->getRepository('GirDatabaseBundle:Parcs');
        $ensemble = $em->getRepository('GirDatabaseBundle:Ensembles');
        $building = $em->getRepository('GirDatabaseBundle:Buildings');

        $query = $em->createQuery(
            'SELECT p.name, count(distinct b.id), count(distinct e.id)
             FROM GirDatabaseBundle:Buildings b, GirDatabaseBundle:Ensembles e, GirDatabaseBundle:Parcs p
             WHERE p.id in (:id)
             AND e.parcs = p.id
             AND e.id = b.ensembles
             GROUP BY p.id')
        ->setParameter('id', '1');

        $parc = $query->getResult();

        return $this->render('GirManageParcsBundle:Parcs:manage.html.twig', array('parc' => $parc ));
    }

Но, когда я приветствовал мою страницу manage.html.twig, у меня есть эта ошибка: ключевое "имя" для массива с ключами "1, 2" не существует в GirGestionPatrimoinesBundle: Parcs: manage.html.twig в строке 35

Итак, вот код для моей ветки:

{# CONTENT #}
<div class="panel-body">
    <p class="text-justify">
        <div class="jumbotron">
            <h4><u>Situation actuelle</u></h4>
                <p>
                    <h5>PARCS</h5>
                        {% for parcs in parc %}
                            <h4> {{ parcs.name}} </h4>
                         {% endfor %}
                </p>
         </div>
      </p>

Я думаю, я не использую хороший способ отображения данных, как я хочу. Вы знаете, что это работает? И я хотел бы показать имя моего парка и его количество ансамблей и зданий, принадлежащих ему.

Это код класса/сущности Parcs: используйте Doctrine\ORM\Mapping как ORM;

/**
 * Parcs
 *
 * @ORM\Table(name="parcs")
 * @ORM\Entity
 */
   class Parcs
   {
     /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

     /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=150, nullable=false)
     */
    private $name;

     /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

     /**
     * Set nom
     *
     * @param string $name
     * @return Parcs
     */
    public function setName($name)
    {
        $this->nom = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

Это код класса/объекта Ensembles:

 /**
 * Ensembles
 *
 * @ORM\Table(name="ensembles")
 * @ORM\Entity
 */
class Ensembles
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

 /**
 * @var string
 *
 * @ORM\Column(name="referenceClient", type="string", length=150, nullable=false)
 */
private $referenceclient;

 /**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}

 /**
 * Set referenceclient
 *
 * @param string $referenceclient
 * @return Ensembles
 */
public function setReferenceclient($referenceclient)
{
    $this->referenceclient = $referenceclient;

    return $this;
}

 /**
 * Get referenceclient
 *
 * @return string
 */
public function getReferenceclient()
{
    return $this->referenceclient;
}

 /**
 * @ORM\ManyToOne(targetEntity="Gir\DatabaseBundle\Entity\Parcs")
 * @ORM\JoinColumn(nullable=false)
 */
private $parcs;

 /**
 * Set parcs
 *
 * @param \Gir\DatabaseBundle\Entity\Parcs $parcs
 * @return Ensembles
 */
public function setParcs(\Gir\DatabaseBundle\Entity\Parcs $parcs)
{
    $this->parcs = $parcs;

    return $this;
}

 /**
 * Get parcs
 *
 * @return \Gir\DatabaseBundle\Entity\Parcs 
 */
public function getParcs()
{
    return $this->parcs

И это последний, класс класса/объекта зданий:

class Batiments
{
 /**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="referenceBatiment", type="string", length=150, nullable=false)
 */
private $referencebatiment;

 /**
 * @ORM\ManyToOne(targetEntity="Gir\DatabaseBundle\Entity\Ensembles")
 * @ORM\JoinColumn(nullable=false)
 */
private $ensembles;

/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set referencebatiment
 *
 * @param string $referencebatiment
 * @return Batiments
 */
public function setReferencebatiment($referencebatiment)
{
    $this->referencebatiment = $referencebatiment;

    return $this;
}

 /**
 * Get referencebatiment
 *
 * @return string 
 */
public function getReferencebatiment()
{
    return $this->referencebatiment;
}

 /**
 * Set ensembles
 *
 * @param \Gir\DatabaseBundle\Entity\Ensembles $ensembles
 * @return Batiments
 */
public function setEnsembles(\Gir\DatabaseBundle\Entity\Ensembles $ensembles)
{
    $this->ensembles = $ensembles;

    return $this;
}

/**
 * Get ensembles
 *
 * @return \Gir\DatabaseBundle\Entity\Ensembles 
 */
public function getEnsembles()
{
    return $this->ensembles;
}

Отвечать на рискую комментарий:

Для {{ dump(parc) }} он возвращает меня:

array (size=1)
  0 => 
    array (size=2)
      'bcnt' => string '307' (length=3)
      'ecnt' => string '104' (length=3)

и для {{ dump(parcs) }}, у меня есть:

array (size=2)
  'bcnt' => string '307' (length=3)
  'ecnt' => string '104' (length=3)
Теги:
twig
dql
doctrine2

2 ответа

2
Лучший ответ

Я думаю, вы забыли псевдоним столбцов:

SELECT count(distinct b.id) AS bcnt, count(distinct e.id) AS ecnt
...

Теперь вы должны иметь доступ к этим переменным:

{% for parcs in parc %}
    <h4> {{ parcs.bcnt }} </h4>
    <h4> {{ parcs.ecnt }} </h4>
{% endfor %}
  • 0
    если я делаю так, как вы предлагаете мне, у меня появляется эта ошибка: «Ключ« bcnt »для массива с ключами« 0 »не существует в строке .twig 35». Я не думаю, что это решение. Благодарю.
  • 0
    Хм, это странно. Попробуйте использовать var_dump в ветке, чтобы получить лучшее представление для этих данных в парках и парках: {{dump (parc)}} {{dump (parcs)}}
Показать ещё 8 комментариев
1

Чтобы избежать этой ошибки, убедитесь, что переменная, которую вы используете в Twig, определена, а не null:

{# CONTENT #}
<div class="panel-body">
    <p class="text-justify">
        <div class="jumbotron">
            <h4><u>Situation actuelle</u></h4>
                <p>
                    <h5>PARCS</h5>
                        {% for parc in parcs %}
                            {% if parc.name is defined and parc.name is not null %}
                            <h4> {{ parcs.name}} </h4>
                            {% else %}
                            <h4> Parc without name</h4>
                            {% endif %}
                         {% endfor %}
                </p>
         </div>
      </p>

BTW, у вас есть опечатка в вашем цикле for, посмотрите на код выше.

  • 0
    извините за опечатку, я попробую ваш код. И моя ошибка исправлена. Но он не отображает данные, которые я хочу. Кстати ничего не показывает. Я хотел бы отобразить количество зданий и ансамблей, принадлежащих парку, и, конечно же, отобразить название парка. Спасибо за помощь мне.
  • 0
    Для этого вам нужно будет показать нам ваш класс и / или classType, чтобы увидеть отношения между вашими сущностями.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню