Я хотел бы найти последний комментарий, написанный в этом порядке.
Мой
Контроллер:
$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".
@NicoHaase Спасибо за ваш комментарий: Попытка вызвать неопределенный метод с именем «findLatest» класса «Doctrine\ORM\PersistentCollection».
Итак, что заставляет вас думать, что вы можете назвать findLatest на коллекции? Вы написали такой метод?




вы пытаетесь вызвать функцию репозитория из другого объекта
попробуйте изменить эту строку:
$order->getComments()->findLatest( $order->getId()
с участием:
$this->getDoctrine()->getRepository(Comments::class)->findLatest($order->getId);
лучше всего будет работать с массивом $orders->getComments(), чтобы избежать запроса данных из базы данных внутри цикла
Оно работает! Идеально. Спасибо большое за вашу поддержку. Я буду использовать его таким образом. Однако мне непонятно, почему в документации и процессе создания отношения сущностей отмечена возможность прямого доступа к нему: вы хотите добавить новое свойство в категорию, чтобы вы могли получить доступ/обновить getProducts ()? (да/нет) [да]: > да symfony.com/doc/current/doctrine/associations.html
конечно, у вас есть прямой доступ к нему, когда вы делаете $order->getComments(), вы получите все комментарии, относящиеся к заказу. и вы можете получить последний комментарий из массива в этом случае
Сделать это можно с помощью класса 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 Я обновил свой ответ, так как допустил ошибку. Я надеюсь, что это работает хорошо сейчас!
Спасибо. Он работает идеально! Ценю твою поддержку!
Что вы подразумеваете под "не работает"? Что происходит, когда вы вызываете
getComments- что такое В самом деле там возвращается?