Symfony4: Как получить данные из связанного объекта?

  • Заказы // заказы
  • Комментарии // комментарии к каждому заказу

Я хотел бы найти последний комментарий, написанный в этом порядке.

Мой

Контроллер:

 $orders = $this->getDoctrine()->getRepository(Orders::class)->findAll();

  foreach($orders as $order) {  
     $temp = array(
         $order->getId(),
         $order->getComments()->findLatest( $order->getId() ) 

Сущность (комментарии):

/**
 * @ORM\ManyToOne(targetEntity = "App\Entity\Orders", inversedBy = "comments")
 */
private $orders;

Сущность (Заказ):

/**
 * @return Collection|Comment[]
 */
public function getComments(): Collection
{
    return $this->comments;
}

Репозиторий комментариев:

public function findLatest($value)
{
    return $this->createQueryBuilder('c')
        ->andWhere('c.orders = :val')
        ->setParameter('val', $value)
        ->orderBy('c.id', 'DESC')
        ->setMaxResults(1)
        ->getQuery()
        ->getResult()
    ;
}

Но похоже, что это не работает таким образом :(

Ошибка:

Attempted to call an undefined method
named "findLatest" of class "Doctrine\ORM\PersistentCollection".

Что вы подразумеваете под "не работает"? Что происходит, когда вы вызываете getComments- что такое В самом деле там возвращается?

Nico Haase 23.05.2019 09:56

@NicoHaase Спасибо за ваш комментарий: Попытка вызвать неопределенный метод с именем «findLatest» класса «Doctrine\ORM\PersistentCollection».

szerz 23.05.2019 10:02

Итак, что заставляет вас думать, что вы можете назвать findLatest на коллекции? Вы написали такой метод?

Nico Haase 23.05.2019 10:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
3
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

вы пытаетесь вызвать функцию репозитория из другого объекта

попробуйте изменить эту строку:

 $order->getComments()->findLatest( $order->getId() 

с участием:

 $this->getDoctrine()->getRepository(Comments::class)->findLatest($order->getId);

лучше всего будет работать с массивом $orders->getComments(), чтобы избежать запроса данных из базы данных внутри цикла

Оно работает! Идеально. Спасибо большое за вашу поддержку. Я буду использовать его таким образом. Однако мне непонятно, почему в документации и процессе создания отношения сущностей отмечена возможность прямого доступа к нему: вы хотите добавить новое свойство в категорию, чтобы вы могли получить доступ/обновить getProducts ()? (да/нет) [да]: > да symfony.com/doc/current/doctrine/associations.html

szerz 23.05.2019 10:22

конечно, у вас есть прямой доступ к нему, когда вы делаете $order->getComments(), вы получите все комментарии, относящиеся к заказу. и вы можете получить последний комментарий из массива в этом случае

Ali Mhanna 23.05.2019 10:26

Сделать это можно с помощью класса Doctrine\Common\Collections\Criteria.

Сущность (Заказ):

use Doctrine\Common\Collections\Criteria;

...

  /**
   * Returns the latest comment or false if no comments found under that criteria
   */ 
  public function findLatestComment()
  {
    $criteria = Criteria::create()
      ->orderBy(array("id" => Criteria::DESC))
    ;

    return $this->getComments()->matching($criteria)->first();
  }

И тогда вы можете просто использовать его следующим образом:

$order->findLatestComment();

Спасибо за поддержку. Это выглядит очень просто и работает отлично!

szerz 23.05.2019 10:36

@szerz Я обновил свой ответ, так как допустил ошибку. Я надеюсь, что это работает хорошо сейчас!

diegowc 23.05.2019 10:37

Спасибо. Он работает идеально! Ценю твою поддержку!

szerz 23.05.2019 10:38

Другие вопросы по теме