2014-10-29 2 views
0

Я пытаюсь получить данные из моей базы данных с помощью следующего кода:Попытки извлечения данных из базы данных в Symfony терпит неудачу

$user = $this->get('security.context')->getToken()->getUser(); 
    $pm = $this->getDoctrine() 
    ->getRepository('LoginLoginBundle:Privatemessage') 
    ->findOneByUser_userid($user->getUserid()); 

Тогда в моем файле веточки я использую это:

 {% for i in 0..(pm|length-1)%} 
      <tr> 
       <td>{{pm[i].sender}}</td><td></td><td>{{pm[i].subject}}</td> 
      </tr> 
      <tr> 
       <td>{{pm[i].contents()}}</td> 
      </tr> 
     {% endfor %} 

Это не может, однако, и дает мне следующую ошибку:

Impossible to access a key "0" on an object of class "Login\LoginBundle\Entity\Privatemessage" that does not implement ArrayAccess interface in LoginLoginBundle:Default:manager.html.twig at line 20 

Если я использую FindAll(), все работает нормально, но потом я получаю все объекты, и мне просто нужно несколько.

ответ

1

Я думаю, вы хотите получить все личные сообщения данного пользователя и отобразить их. В этом случае вы должны использовать findBy*() вместо findOneBy*(). Первый будет возвращать ArrayCollection, а не только экземпляр PrivateMessage.

$user = $this->get('security.context')->getToken()->getUser(); 
$pm = $this->getDoctrine() 
    ->getRepository('LoginLoginBundle:Privatemessage') 
    ->findByUser_userid($user->getUserid()); 

Я также рекомендую использовать Twig «s for перебирать каждый элемент коллекции, как это:

{% for message in pm %} 
    <tr> 
     <td>{{message.sender}}</td><td></td><td>{{message.subject}}</td> 
    </tr> 
    <tr> 
     <td>{{message.contents()}}</td> 
    </tr> 
{% endfor %} 

Вы можете прочитать документацию here.

+0

Здравствуйте, спасибо для этого, for-loop действительно лучше, чем тот, который я использовал. Теперь все отлично работает: D –

2

findOneBy() методы используются для запроса только одного экземпляра вашего объекта. Он не возвращает коллекцию, через которую вы можете выполнять итерацию.

В коде вы делили вы выборку только один экземпляр Privatemessage и вы пытаетесь манипулировать им, как если бы это была коллекция личных сообщений. Вы не может сделайте это.

Ваш код работает нормально, когда вы используете findAll(), потому что findAll() возвращает ArrayCollection частных сообщений, которые вы можете пропустить.

Если вы хотите получить только некоторые из ваших личных сообщений, основанных на любых ограничениях, вы должны затем apply filters при запросе их.

+0

Эй, спасибо за ваш ответ, я искал, как я могу применять эти фильтры, но ничего не нашел .. как я могу применить фильтр к моему запросу? –

+0

С помощью where(), orderBy() & setMaxResults(), ... и т. Д. [Вот документация] (http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html#high -уровень-апи-метода). Вы также должны изменить способ повторения результатов, @FyodorX прав, вы должны проходить через каждый элемент своей коллекции, используя {% for ... in ...%} loop –

Смежные вопросы