我試著用教義請求來獲取存盤在message_document表中的檔案,但是請求回圈并最終填滿我的記憶體。 我在Dbeaver上用sql嘗試了同樣的請求,它的運行沒有問題
。非常感謝您的幫助
。我的訊息.php
在這里輸入代碼<?php
namespace AppEntity;
use DateTime;
use DoctrineCommonCollectionCollection;
use DoctrineORMMapping as ORM;
use AppRepositoryMessageRepository;
使用 DoctrineCommonCollectionsArrayCollection。
/**。
* @ORMEntity(repositoryClass=MessageRepository::class)
*/
class Message
{
/**。
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**。
* @ORMColumn(type="text")
*/
private $content;
/**。
* @ORMColumn(type="datetime")
*/
private $createdAt;
/**。
* @ORMManyToOne(targetEntity=Conversation::class, inversedBy=" messages")
*/
private $conversation;
/**。
* @ORMManyToOne(targetEntity=User::class, inversedBy="mages")
*/
private $user;
/**。
* @ORMOneToMany(targetEntity=MessageDocument::class, mappedBy=" messages")
*/
private $messageDocuments;
public function __construct( string $content, 用戶 $user, Conversation $converstation) {
$this->content = $content;
$this->user = $user;
$this->對話=$converstation。
$this->createdAt = new DateTime('now');
$this-> messageDocuments = new ArrayCollection();
}
public function getId():?int{
return $this->id。
}
public function getContent():?string{
return $this->content。
}
public function setContent(string $content) 。 self {
$this->content = $content;
return $this;
}
public function getCreatedAt() :? DateTimeInterface{
return $this-> createdAt;
}
public function setCreatedAt(DateTimeInterface $createdAt) 。 self {
$this-> createdAt = $createdAt;
return $this;
}
public function getConversation() :?Conversation
{
return $this->對話。
}
public function setConversation(? Conversation $conversation):self {
$this->對話 = $conversation;
return $this;
}
public function getUser():?User{
return $this-> user;
}
public function setUser(? User $user):self {
$this-> user = $user;
return $this;
}
/**.
* @return Collection|MessageDocument[] 。
*/
public function getMessageDocuments() 。Collection: .
{
return $this-> messageDocuments;
}
public function addMessageDocument(MessageDocument $messageDocument) 。self: self
{
if (!$this->messageDocuments-> contains($messageDocument) {
$this-> messageDocuments[] = $messageDocument;
$messageDocument->setMessages($this) 。
}
return $this;
}
title">removeMessageDocument(MessageDocument $messageDocument) 。self: self
{
if ($this-> messageDocuments-> removeElement($messageDocument) {
//設定擁有方為空(除非已經改變)。
if ($messageDocument->getMessages() ==$this) {
$messageDocument->setMessages(null)。
}
}
return $this;
}
my MessageDocument.php
在此輸入代碼<?php
namespace AppEntity;
使用 AppRepositoryMessageDocumentRepository。
use DoctrineORMMapping as ORM;
/**。
* @ORMEntity(repositoryClass=MessageDocumentRepository::class)
*/
class MessageDocument
{
/**。
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**。
* @ORMColumn(type="string", length=255)
*/
private $fileName;
/**。
* @ORMColumn(type="datetime")
*/
private $updatedAt;
/**.
* @ORMColumn(type="string", length=255, nullable=true)
*/
private $type;
/**。
* @ORMManyToOne(targetEntity=Message::class, inversedBy="messageDocuments")
*/
private $message;
/**。
* @ORMManyToOne(targetEntity=User::class, inversedBy="messageDocuments")
*/
private $sender;
public function getId(): ?int
{
return $this->id。
}
public function getFileName(): ?string
{
return $this-> fileName;
}
public function setFileName(string $fileName) 。self
{
$this->fileName = $fileName;
return $this;
}
public function getUpdatedAt(): ? DateTimeInterface: ?
{
return $this-> updatedAt;
}
public function setUpdatedAt(DateTimeInterface $updatedAt) 。self: self
{
$this->upedAt = $updatedAt;
return $this;
}
public function getType(): ?string
{
return $this->type;
}
public function setType(? string $type)。) self: self
{
$this->type = $type;
return $this;
}
public function getMessage(): ?
{
return $this->訊息。
}
public function setMessage(? Message $message) 。self ?
{
$this-> message = $message;
return $this;
}
public function getSender(): ?User
{
return $this-> sender;
}
public function setSender(? User $sender)。self: self.
{
$this->sender = $sender;
return $this;
}
對MessageDocument的請求加入Message
。/**.
* @return MessageDocument[] 回傳一個MessageDocument物件的陣列。
*/
//$qb->expr()->eq('md.id = :val')
//,Join::WITH,$qb->expr()->eq('md.id = :val')
public function findDocByMessageId($messageId)
{
return $this->createQueryBuilder('md'/span>)
->選擇('md')
->加入('md.message'/span>,'m')
->where('m.id =:val')
->setParameter('val', $messageId)
->setMaxResults(20)
->getQuery()
->getResult()。
}
回購請求的呼叫
$allMessages = new ArrayCollection()。
$docs=[];
foreach ($messages as $messageUnique) {
$messId = $messageUnique->getId()。
$documentsMessages = $messageRepository->findDocByMessageId($messId)。
if($documentsMessages !== null){
foreach($documentsMessages as $document) {
$docs=$document。
}
//$messageUnique->addMessageDocument($document);
}
$conversation->setLastMessage($messageUnique)。
$messageUnique = array(
'id' => $messageUnique->getId()。
'author' => $messageUnique->getUser()->getFullName()。
'authorId' => $messageUnique->getUser()->getId() 。
'content' => $messageUnique->getContent()。
'createdAt' => $messageUnique-> getCreatedAt()
);
$allMessages->add($messageUnique) 。
}
uj5u.com熱心網友回復:
我完全不確定用同一個變數的值來設定$messageUnique = array(),你可能應該使用另一個變數的名字。如果你有一個無限回圈的問題,在你的情況下,它來自于PHP。
uj5u.com熱心網友回復:
我已經修改了我的代碼,現在錯誤資訊是關于回圈參考的
資訊物體 <?phpnamespace AppEntity;
use DateTime;
use DoctrineCommonCollectionCollection;
use DoctrineORMMapping as ORM;
use AppRepositoryMessageRepository;
使用 DoctrineCommonCollectionsArrayCollection。
/**。
* @ORMEntity(repositoryClass=MessageRepository::class)
*/
class Message
{
/**。
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**。
* @ORMColumn(type="text")
*/
private $content;
/**。
* @ORMColumn(type="datetime")
*/
private $createdAt;
/**。
* @ORMManyToOne(targetEntity=Conversation::class, inversedBy=" messages")
*/
private $conversation;
/**。
* @ORMManyToOne(targetEntity=User::class, inversedBy="mages")
*/
private $user;
/**。
* @ORMOneToMany(targetEntity=MessageDocument::class, mappedBy="message")
*/
private $messageDocument;
public function __construct( string $content, 用戶 $user, Conversation $converstation) {
$this->content = $content;
$this->user = $user;
$this->對話=$converstation。
$this->createdAt = new DateTime('now');
$this-> messageDocuments = new ArrayCollection();
}
public function getId():?int{
return $this->id。
}
public function getContent():?string{
return $this->content。
}
public function setContent(string $content) 。 self {
$this->content = $content;
return $this;
}
public function getCreatedAt() :? DateTimeInterface{
return $this-> createdAt;
}
public function setCreatedAt(DateTimeInterface $createdAt) 。 self {
$this-> createdAt = $createdAt;
return $this;
}
public function getConversation() :?Conversation
{
return $this->對話。
}
public function setConversation(? Conversation $conversation):self {
$this->對話 = $conversation;
return $this;
}
public function getUser():?User{
return $this-> user;
}
public function setUser(? User $user):self {
$this-> user = $user;
return $this;
}
/**.
* @return Collection|MessageDocument[] 。
*/
public function getMessageDocument() 。Collection
{
return $this-> messageDocument;
}
public function addMessageDocument(MessageDocument $messageDocument) 。self: self
{
if (!$this->messageDocument-> contains($messageDocument) {
$this-> messageDocument[] = $messageDocument;
$messageDocument->setMessages($this) 。
}
return $this;
}
title">removeMessageDocument(MessageDocument $messageDocument) 。self: self
{
if ($this-> messageDocuments-> removeElement($messageDocument) {
//設定擁有方為空(除非已經改變)。
if ($messageDocument->getMessages() ==$this) {
$messageDocument->setMessages(null)。
}
}
return $this;
}
MessageDocument物體
<?php
namespace AppEntity。
使用 AppRepositoryMessageDocumentRepository。
use DoctrineORMMapping as ORM;
/**。
* @ORMEntity(repositoryClass=MessageDocumentRepository::class)
*/
class MessageDocument
{
/**。
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**。
* @ORMColumn(type="string", length=255)
*/
private $fileName;
/**。
* @ORMColumn(type="datetime")
*/
private $updatedAt;
/**.
* @ORMColumn(type="string", length=255, nullable=true)
*/
private $type;
/**。
* @ORMManyToOne(targetEntity=Message::class, inversedBy="messageDocument")
*/
private $message;
/**。
* @ORMManyToOne(targetEntity=User::class, inversedBy="messageDocument")
*/
private $sender;
public function getId(): ?int
{
return $this->id。
}
public function getFileName(): ?string
{
return $this-> fileName;
}
public function setFileName(string $fileName) 。self
{
$this->fileName = $fileName;
return $this;
}
public function getUpdatedAt(): ? DateTimeInterface: ?
{
return $this-> updatedAt;
}
public function setUpdatedAt(DateTimeInterface $updatedAt) 。self: self
{
$this->upedAt = $updatedAt;
return $this;
}
public function getType(): ?string
{
return $this->type;
}
public function setType(? string $type)。) self: self
{
$this->type = $type;
return $this;
}
public function getMessage(): ?
{
return $this->訊息。
}
public function setMessage(? Message $message) 。self ?
{
$this-> message = $message;
return $this;
}
public function getSender(): ?User
{
return $this-> sender;
}
public function setSender(? User $sender)。self: self.
{
$this->sender = $sender;
return $this;
}
js用于從twig呼叫控制器
function getMessages(conversationId , userId) /span>{
superConversationId = conversationId;
userIdEnCours = userId;
//* On vide ce qu'il y avait avant.
removeAllChildNodes(document.querySelector('.msg_history') )。
//* On remet toutes les conversations en blanc.
let allDivs = document.getElementsByClassName('chat_list')。
for (let div of allDivs) {
div.style.background = '#f8f8f8';
}
//* background-color light-grey quand conversation selectionné
$("#" conversationId).css('background', "#e1e1e1")
讓xmlhttp = new XMLHttpRequest()。
xmlhttp.onreadystatechange = function () /span>{
//si requête validé on traite la réponse。
if (this.readyState == 4 && this.status == 200) {
let messages = JSON.parse(this.response);
let discussion = document.querySelector('.msg_history');
for (let message of messages) {
讓dateMessage = new Date(message.createdAt)
var lastMessageId = message.id。
//* Affichage selon envoyé ou re?u
if (message.authorId == userIdEnCours) {
discussion.innerHTML = "<div class="outgoing_msg col-12"><div class="send_msg col-6 m-0">"/span>
"<p class='m-0'>" message.content "</p>"
"<span class="time_date"> De" message.author " |" dateMessage.toLocaleString() "</span>"
"</div>"
;
} else {
discussion.innerHTML = "<div class="incoming_msg col-12">"/span>
"<div class="received_msg col-12"><div class="received_withd_msg col-6">".
"<p>" message.content "</p>"
"<span class="time_date_receiver">De" message.author " |" dateMessage.toLocaleString() "</span>"
"</div></div>"。
;
}
}
//* scroll dernier message >。
let divMessagerie = document.querySelector(".msg_history")。
divMessagerie.scrollTop = divMessagerie.scrollHeight;
//vl le 13/09
//span class="hljs-comment"> ne voyant pas l'utilité ...
/* Interval = setInterval( ( ) => {
$.ajax({
type: "POST"。
url : "/checkMessage/" lastMessageId,
success: function (response) {
如果(response === true) {
clearInterval(Interval)。
getMessages(
superConversationId,
userIdEnCours
);
}
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown)。
}
});
}, 5000); */
}
};
//! 啟用請求(MOCK VERS PROD)。
//* PROD
///xmlhttp.open("GET", "http://www.generation-boomerang.com/messagerie/conv/" conversationId);
//* DEV
xmlhttp.open("GET", "/messagerie/conv/" conversationId)。)
xmlhttp.send()。
}
從對話中獲取訊息的控制器
/**。
* @Route("/messagerie/conv/{id}" , name="messagerie_getMessagesOfConv" )
* @Security("is_granted('ROLE_ABONNE') or is_granted('ROLE_ADMIN')", message="Merci de vous abonner au portail pour bénéficier de cette super fonctionnalité!" )
*/
title">getMessagesOfConv(int $id, EntityManagerInterface $entityManager, ConversationRepository $conversationRepository, ParticipantRepository $participantRepository,MessageDocumentRepository $messageRepository) {
//* Récup du user check à faire[/span].
$userEncours = $this->getUser()。
$userId = $userEncours->getId()。
//* 查詢對話是否適用于用戶。
$check = $participantRepository->checkBelongs($id, $userId)。
if ($check != 1) {
return $this->json('cette conv ne te regarde pas ! ');
}
$conversation = $conversationRepository-> find($id) 。
$messages = $conversation->getMessages()。
//$documentsMessages = new ArrayCollection(); //vl
$allMessages = new ArrayCollection()。
//$docs=;
foreach ($messages as $messageUnique) {
$messId = $messageUnique->getId()。
$documentsMessages = $messageRepository->findDocByMessageId($messId)。
if($documentsMessages !== null){
foreach($documentsMessages as $document) {
//$docs=$document;)
$messageUnique->addMessageDocument($document)。
}
}
$conversation->setLastMessage($messageUnique)。
$messageUnique = array(
'id' => $messageUnique->getId()。
'author' => $messageUnique->getUser()->getFullName()。
'authorId' => $messageUnique->getUser()->getId() 。
'content' => $messageUnique->getContent()。
'createdAt' => $messageUnique->getCreatedAt()。
'messageDocuments'=>$messageUnique-> getMessageDocument()
);
$allMessages-> add($messageUnique);
}
$entityManager->persist($conversation)。
$entityManager->flush()。
//echo '<pre>'; var_dump( $conversation); exit;echo '</pre>'; //
return $this->json($allMessages)。
}
對話物體
namespace AppEntity。
use AppRepositoryConversationRepository;
use DoctrineCommonCollectionArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
/**。
* @ORMEntity(repositoryClass=ConversationRepository::class)
*/
class Conversation {
/**。
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**。
* @ORMOneToOne(targetEntity=Message::class, cascade={"persist", "remove"})
*/
private $lastMessage;
/**。
* @ORMOneToMany(targetEntity=Message::class, mappedBy="conversation")
*/
private $messages;
/**。
* @ORMOneToMany(targetEntity="參與者", mappedBy="對話")
*/
private $participants;
/**。
* @ORMColumn(type="string" , length=50)
*/
private $title;
/**。
* @ORMColumn(type="datetime")
*/
private $createdAt;
public function __construct(){
$this->contents = new ArrayCollection();
$this->messages = new ArrayCollection();
$this-> createdAt = new DateTime('now');
}
public function getId():?int{
return $this->id。
}
public function getLastMessage() :? Message {
return $this-> lastMessage;
}
public function setLastMessage(? Message $lastMessage):self {
$this-> lastMessage = $lastMessage;
return $this;
}
/**.
* @return Collection|Message[] 。
*/
public function getMessages():Collection{
return $this-> messages;
}
public function addMessage(Message $message) 。 self {
if (!$this-> messages-> contains($message)) {
$this-> messages[] = $message;
$message->setConversation($this)。
}
return $this;
}
public function removeMessage(Message $message) 。 self {
if ($this-> messages-> contains($message)) {
$this-> messages->removeElement($message)。
//將擁有方設定為空(除非已經改變)。
if ($message->getConversation() === $this) {
$message->setConversation(null)。
}
}
return $this;
}
/**.
* @return Collection|Participant[] 。
*/
public function getParticipants()。 Collection {
return $this->partants。
}
public function addParticipant(Participant $participant) 。 self {
if (!$this-> participants-> contains($participant) {
$this-> participants[] = $participant;
$participant->setConversation($this)。
}
return $this。
}
public function removeParticipant(Participant $participant) 。 self {
if ($this-> participants-> contains($participant)) {
$this-> participants->removeElement($participant)。
//將擁有方設定為空(除非已經改變)。
if ($participant->getConversation() ==$this) {
$participant->setConversation(null)。
}
}
return $this;
}
/**。
*獲取標題的值
*/
public function getTitle() {
return $this-> title。
}
/***。
* 設定標題的值
* @return self
*/
public function setTitle($title) /span>{
$this->title = $title;
return $this;
}
public function getCreatedAt() :? DateTimeInterface{
return $this-> createdAt;
}
public function setCreatedAt(DateTimeInterface $createdAt) 。 self {
$this-> createdAt = $createdAt;
return $this;
}
和參與者物體
<?php
namespace AppEntity。
使用 AppRepositoryParticipantRepository。
use DoctrineCommonCollectionArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
/**。
* @ORMEntity(repositoryClass=ParticipantRepository::class)
*/
class Participant
{
/**。
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
*/
private $id;
/**。
* @ORMManyToOne(targetEntity="User", inversedBy="partants")
*/
private $user;
/**。
* @ORMManyToOne(targetEntity="Conversation", inversedBy="plants")
*/
private $conversation。
private $messageReadAt;
/**。
*獲取id的值
*/
public function getId()
{
return $this-> id;
}
/***。
*獲取用戶的值
*/
public function getUser()
{
return $this-> user;
}
/***。
* 設定用戶的值
*
* @return self
*/
public function setUser($user)
{
$this->user = $user;
return $this;
}
/***。
*獲取對話的值
*/
public function getConversation()
{
return $this->對話。
}
/**。
* 設定對話的值
*
* @return self
*/
public function setConversation($conversation)
{
$this->對話=$conversation。
return $this;
}
/***。
* 獲取 messageReadAt 的值
*/
public function getMessageReadAt()
{
return $this-> messageReadAt;
}
/***。
* 設定 messageReadAt 的值
*
* @return self
*/
public function setMessageReadAt($messageReadAt)
{
$this-> messageReadAt = $messageReadAt;
return $this;
}
還有一個CreateMessageHandler和GetMessageHanler(但我不明白它是如何作業的)
。CreateMessageHandler <?php
namespace AppMessageHandler。
use AppEntityUser;
使用 AppEntityMessage;
使用 AppEntityConversation。
使用 AppMessageCreateMessage。
使用 DoctrineORMEntityManagerInterface;
使用 SymfonyComponent信使處理程式MessageHandlerInterface。
class CreateMessageHandler implements MessageHandlerInterface
{
private $entityManager;
title">__construct(EntityManagerInterface $entityManager) {
$this-> entityManager = $entityManager;
}
title">__invoke(CreateMessage $createMessage>)
{
$conversation = $this->entityManager->getRepository(Conversation::class)-> find($createMessage->getConversationId() )。
if(is_null($conversation)
{
$conversation = new Conversation()。
$this->entityManager->persist($conversation)。
$this->entityManager->flush()。
} else {
$message = new Message(
$createMessage->getContent(),
$this->entityManager->getRepository(User::class)->find($createMessage->getUserId()。
$conversation,
);
// if ().
}
// Debug
// echo $createMessage->getContent();
// echo $message->getUser()->getId();
// echo $message->getConversation()->getId();
$this->entityManager->persist($message)。
$this->entityManager->flush()。
}
GetMessageHandler <?php
namespace AppMessageHandler;
使用 AppEntityMessage。
使用 AppMessageGetMessages。
use AppRepositoryMessageRepository;
use DoctrineORMEntityManagerInterface;
使用 SymfonyComponent信使處理程式MessageHandlerInterface。
class GetMessagesHandler implements MessageHandlerInterface
{
private $entityManager;
private $messageRepository;
public function __construct(EntityManagerInterface $entityManager, MessageRepository $messageRepository) {
$this-> entityManager = $entityManager;
}
public function __invoke(GetMessages $message)
{
//Récérer les messages de la conversation。
return $this->entityManager->getRepository(Message:: class)->findBy(['conversation' => $message->getConversationId() ])。
}
}
我認為一切都在那里。 有點長,對不起... 希望有人能找到我有這種回圈參考的原因
。謝謝
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/310755.html
標籤:
