简体   繁体   English

查找所有帖子,并按帖子中的最新消息排序。 教义2和ZF2

[英]Find all posts and order by latest message in post. Doctrine2 and ZF2

I have a problem I have been thinking on for a long time, and have no idea how to solve... Could you guide me in the right direction or give me any advice on hove to solve it? 我有一个已经思考了很长时间的问题,并且不知道如何解决...您能指导我正确的方向还是给我任何解决问题的建议?

I have a consultation table, where each row have many messages. 我有一个咨询表,其中每一行都有很多消息。 I want to retreive all the consultations with a certain criteria, then return the list ordered by tag, and the last item in a OneToMany relation... 我想使用特定条件检索所有协商,然后返回按标签排序的列表以及OneToMany关系中的最后一项...

This is the code I have now: 这是我现在拥有的代码:

public function indexAction()
{
    $em = $this->getEntityManager();
    /** @var EntityRepository $repo */
    $repo = $em->getRepository('Common\Entity\Konsultasjon');
    $meldinger = $repo->findBy([
            'kundeid' => '1',
            'state' => '1',
            'skjult' => '0'
            ],[
                'tag' => 'ASC',
            ]
        );


    return new ViewModel(['meldinger' => $meldinger]);
}

This is my Konsultasjon entity: 这是我的Konsultasjon实体:

<?php

namespace Common\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Konsultasjon
 *
 * @ORM\Table(name="konsultasjon", uniqueConstraints={@ORM\UniqueConstraint(name="id_UNIQUE", columns={"konsultasjonid"})}, indexes={@ORM\Index(name="state", columns={"state"}), @ORM\Index(name="kundeid", columns={"kundeid"}), @ORM\Index(name="tag", columns={"tag"})})
 * @ORM\Entity
 */
class Konsultasjon
{
/**
 * @var integer
 *
 * @ORM\Column(name="konsultasjonid", type="integer", precision=0, scale=0, nullable=false, unique=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private $konsultasjonid;

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\OneToMany(targetEntity="Common\Entity\Meldinger", mappedBy="konsulatsjon", cascade={"persist"}, fetch="EAGER")
 * @ORM\JoinColumn(name="meldinger", referencedColumnName="meldingerid")
 */
private $meldinger;

/**
 * @var integer
 *
 * @ORM\Column(name="sourceaddr", type="bigint", precision=0, scale=0, nullable=true, unique=false)
 */
private $sourceaddr;

/**
 * @var string
 *
 * @ORM\Column(name="prefix", type="text", precision=0, scale=0, nullable=true, unique=false)
 */
private $prefix;

/**
 * @var string
 *
 * @ORM\Column(name="subprefix", type="text", precision=0, scale=0, nullable=true, unique=false)
 */
private $subprefix;

/**
 * @var integer
 *
 * @ORM\Column(name="campaignid", type="integer", precision=0, scale=0, nullable=true, unique=false)
 */
private $campaignid;

/**
 * @var integer
 *
 * @ORM\Column(name="destinationaddr", type="integer", precision=0, scale=0, nullable=true, unique=false)
 */
private $destinationaddr;

/**
 * @var integer
 *
 * @ORM\Column(name="kundeid", type="integer", precision=0, scale=0, nullable=true, unique=false)
 */
private $kundeid;

/**
 * @var integer
 *
 * @ORM\Column(name="state", type="integer", precision=0, scale=0, nullable=true, unique=false)
 */
private $state;

/**
 * @var integer
 *
 * @ORM\Column(name="status", type="integer", precision=0, scale=0, nullable=true, unique=false)
 */
private $status;

/**
 * @var integer
 *
 * @ORM\Column(name="blocked", type="integer", precision=0, scale=0, nullable=true, unique=false)
 */
private $blocked;

/**
 * @var integer
 *
 * @ORM\Column(name="skjult", type="integer", precision=0, scale=0, nullable=true, unique=false)
 */
private $skjult;

/**
 * @var integer
 *
 * @ORM\Column(name="tag", type="integer", precision=0, scale=0, nullable=false, unique=false)
 */
private $tag;



/**
 * Constructor
 */
public function __construct()
{
    $this->meldinger = new \Doctrine\Common\Collections\ArrayCollection();
}

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

/**
 * Set sourceaddr
 *
 * @param integer $sourceaddr
 * @return Konsultasjon
 */
public function setSourceaddr($sourceaddr)
{
    $this->sourceaddr = $sourceaddr;

    return $this;
}

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

/**
 * Set prefix
 *
 * @param string $prefix
 * @return Konsultasjon
 */
public function setPrefix($prefix)
{
    $this->prefix = $prefix;

    return $this;
}

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

/**
 * Set subprefix
 *
 * @param string $subprefix
 * @return Konsultasjon
 */
public function setSubprefix($subprefix)
{
    $this->subprefix = $subprefix;

    return $this;
}

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

/**
 * Set campaignid
 *
 * @param integer $campaignid
 * @return Konsultasjon
 */
public function setCampaignid($campaignid)
{
    $this->campaignid = $campaignid;

    return $this;
}

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

/**
 * Set destinationaddr
 *
 * @param integer $destinationaddr
 * @return Konsultasjon
 */
public function setDestinationaddr($destinationaddr)
{
    $this->destinationaddr = $destinationaddr;

    return $this;
}

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

/**
 * Set kundeid
 *
 * @param integer $kundeid
 * @return Konsultasjon
 */
public function setKundeid($kundeid)
{
    $this->kundeid = $kundeid;

    return $this;
}

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

/**
 * Set state
 *
 * @param integer $state
 * @return Konsultasjon
 */
public function setState($state)
{
    $this->state = $state;

    return $this;
}

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

/**
 * Set status
 *
 * @param integer $status
 * @return Konsultasjon
 */
public function setStatus($status)
{
    $this->status = $status;

    return $this;
}

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

/**
 * Set blocked
 *
 * @param integer $blocked
 * @return Konsultasjon
 */
public function setBlocked($blocked)
{
    $this->blocked = $blocked;

    return $this;
}

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

/**
 * Set skjult
 *
 * @param integer $skjult
 * @return Konsultasjon
 */
public function setSkjult($skjult)
{
    $this->skjult = $skjult;

    return $this;
}

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

/**
 * Set tag
 *
 * @param integer $tag
 * @return Konsultasjon
 */
public function setTag($tag)
{
    $this->tag = $tag;

    return $this;
}

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

/**
 * Add meldinger
 *
 * @param \Common\Entity\Meldinger $meldinger
 * @return Konsultasjon
 */
public function addMeldinger(\Common\Entity\Meldinger $meldinger)
{
    $this->meldinger[] = $meldinger;

    return $this;
}

/**
 * Remove meldinger
 *
 * @param \Common\Entity\Meldinger $meldinger
 */
public function removeMeldinger(\Common\Entity\Meldinger $meldinger)
{
    $this->meldinger->removeElement($meldinger);
}

/**
 * Get meldinger
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getMeldinger()
{
    return $this->meldinger;
}
}

And for the record, my Meldinger entity: 作为记录,我的Meldinger实体:

<?php

namespace Common\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Meldinger
 *
 * @ORM\Table(name="meldinger",options={"collate"="utf8_swedish_ci"}, uniqueConstraints={@ORM\UniqueConstraint(name="id", columns={"meldingerid"})}, indexes={@ORM\Index(name="konsultasjon", columns={"konsulatsjon"}), @ORM\Index(name="state", columns={"state"}), @ORM\Index(name="kundeid", columns={"kundeid"}), @ORM\Index(name="type", columns={"type"}), @ORM\Index(name="dato", columns={"dato"})})
 * @ORM\Entity
 */
class Meldinger
{
    /**
     * @var integer
     *
     * @ORM\Column(name="meldingerid", type="integer", precision=0, scale=0, nullable=false, unique=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $meldingerid;


    /**
     * @var string
     *
     * @ORM\Column(name="sourceaddr", type="text", precision=0, scale=0, nullable=false, unique=false)
     */
    private $sourceaddr;

    /**
     * @var integer
     *
     * @ORM\Column(name="destinationaddr", type="bigint", precision=0, scale=0, nullable=false, unique=false)
     */
    private $destinationaddr;

    /**
     * @var string
     *
     * @ORM\Column(name="prefix", type="text", precision=0, scale=0, nullable=true, unique=false)
     */
    private $prefix;

    /**
     * @var string
     *
     * @ORM\Column(name="message", type="text", precision=0, scale=0, nullable=false, unique=false)
     */
    private $message;

    /**
     * @var integer
     *
     * @ORM\Column(name="refno", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $refno;

    /**
     * @var integer
     *
     * @ORM\Column(name="retrycount", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $retrycount;

    /**
     * @var integer
     *
     * @ORM\Column(name="operator", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $operator;

    /**
     * @var integer
     *
     * @ORM\Column(name="state", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $state;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="dato", type="datetime", precision=0, scale=0, nullable=false, unique=false)
     */
    private $dato;

    /**
     * @var integer
     *
     * @ORM\Column(name="replypathid", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $replypathid;

    /**
     * @var integer
     *
     * @ORM\Column(name="replypathvalue", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $replypathvalue;

    /**
     * @var string
     *
     * @ORM\Column(name="referenceid", type="text", precision=0, scale=0, nullable=true, unique=false)
     */
    private $referenceid;

    /**
     * @var string
     *
     * @ORM\Column(name="requesttype", type="text", precision=0, scale=0, nullable=true, unique=false)
     */
    private $requesttype;

    /**
     * @var integer
     *
     * @ORM\ManyToOne(targetEntity="Konsultasjon", inversedBy="meldinger")
     * @ORM\JoinColumn(name="konsulatsjon", referencedColumnName="konsultasjonid")
     */
    private $konsulatsjon;

    /**
     * @var integer
     *
     * @ORM\Column(name="campaignid", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $campaignid;

    /**
     * @var integer
     *
     * @ORM\Column(name="brukerid", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $brukerid;

    /**
     * @var integer
     *
     * @ORM\Column(name="kundeid", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $kundeid;

    /**
     * @var integer
     *
     * @ORM\Column(name="type", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $type;

    /**
     * @var integer
     *
     * @ORM\Column(name="pricegroup", type="integer", precision=0, scale=0, nullable=true, unique=false)
     */
    private $pricegroup;

    /**
     * @var string
     *
     * @ORM\Column(name="tilbakemelding", type="text", precision=0, scale=0, nullable=true, unique=false)
     */
    private $tilbakemelding;

    /**
     * @var string
     *
     * @ORM\Column(name="status_kode", type="text", precision=0, scale=0, nullable=true, unique=false)
     */
    private $statusKode;

    /**
     * @var string
     *
     * @ORM\Column(name="status_beskrivelse", type="text", precision=0, scale=0, nullable=true, unique=false)
     */
    private $statusBeskrivelse;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="status_timestamp", type="datetime", precision=0, scale=0, nullable=true, unique=false)
     */
    private $statusTimestamp;


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

    /**
     * Set sourceaddr
     *
     * @param string $sourceaddr
     * @return Meldinger
     */
    public function setSourceaddr($sourceaddr)
    {
        $this->sourceaddr = $sourceaddr;

        return $this;
    }

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

    /**
     * Set destinationaddr
     *
     * @param integer $destinationaddr
     * @return Meldinger
     */
    public function setDestinationaddr($destinationaddr)
    {
        $this->destinationaddr = $destinationaddr;

        return $this;
    }

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

    /**
     * Set prefix
     *
     * @param string $prefix
     * @return Meldinger
     */
    public function setPrefix($prefix)
    {
        $this->prefix = $prefix;

        return $this;
    }

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

    /**
     * Set message
     *
     * @param string $message
     * @return Meldinger
     */
    public function setMessage($message)
    {
        $this->message = $message;

        return $this;
    }

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

    /**
     * Set refno
     *
     * @param integer $refno
     * @return Meldinger
     */
    public function setRefno($refno)
    {
        $this->refno = $refno;

        return $this;
    }

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

    /**
     * Set retrycount
     *
     * @param integer $retrycount
     * @return Meldinger
     */
    public function setRetrycount($retrycount)
    {
        $this->retrycount = $retrycount;

        return $this;
    }

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

    /**
     * Set operator
     *
     * @param integer $operator
     * @return Meldinger
     */
    public function setOperator($operator)
    {
        $this->operator = $operator;

        return $this;
    }

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

    /**
     * Set state
     *
     * @param integer $state
     * @return Meldinger
     */
    public function setState($state)
    {
        $this->state = $state;

        return $this;
    }

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

    /**
     * Set dato
     *
     * @param \DateTime $dato
     * @return Meldinger
     */
    public function setDato($dato)
    {
        $this->dato = $dato;

        return $this;
    }

    /**
     * Get dato
     *
     * @return \DateTime 
     */
    public function getDato()
    {
        return $this->dato;
    }

    /**
     * Set replypathid
     *
     * @param integer $replypathid
     * @return Meldinger
     */
    public function setReplypathid($replypathid)
    {
        $this->replypathid = $replypathid;

        return $this;
    }

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

    /**
     * Set replypathvalue
     *
     * @param integer $replypathvalue
     * @return Meldinger
     */
    public function setReplypathvalue($replypathvalue)
    {
        $this->replypathvalue = $replypathvalue;

        return $this;
    }

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

    /**
     * Set referenceid
     *
     * @param string $referenceid
     * @return Meldinger
     */
    public function setReferenceid($referenceid)
    {
        $this->referenceid = $referenceid;

        return $this;
    }

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

    /**
     * Set requesttype
     *
     * @param string $requesttype
     * @return Meldinger
     */
    public function setRequesttype($requesttype)
    {
        $this->requesttype = $requesttype;

        return $this;
    }

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

    /**
     * Set konsulatsjon
     *
     * @param integer $konsulatsjon
     * @return Meldinger
     */
    public function setKonsulatsjon($konsulatsjon)
    {
        $this->$konsulatsjon = $konsulatsjon;

        return $this;
    }

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

    /**
     * Set campaignid
     *
     * @param integer $campaignid
     * @return Meldinger
     */
    public function setCampaignid($campaignid)
    {
        $this->campaignid = $campaignid;

        return $this;
    }

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

    /**
     * Set brukerid
     *
     * @param integer $brukerid
     * @return Meldinger
     */
    public function setBrukerid($brukerid)
    {
        $this->brukerid = $brukerid;

        return $this;
    }

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

    /**
     * Set kundeid
     *
     * @param integer $kundeid
     * @return Meldinger
     */
    public function setKundeid($kundeid)
    {
        $this->kundeid = $kundeid;

        return $this;
    }

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

    /**
     * Set type
     *
     * @param integer $type
     * @return Meldinger
     */
    public function setType($type)
    {
        $this->type = $type;

        return $this;
    }

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

    /**
     * Set pricegroup
     *
     * @param integer $pricegroup
     * @return Meldinger
     */
    public function setPricegroup($pricegroup)
    {
        $this->pricegroup = $pricegroup;

        return $this;
    }

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

    /**
     * Set tilbakemelding
     *
     * @param string $tilbakemelding
     * @return Meldinger
     */
    public function setTilbakemelding($tilbakemelding)
    {
        $this->tilbakemelding = $tilbakemelding;

        return $this;
    }

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

    /**
     * Set statusKode
     *
     * @param string $statusKode
     * @return Meldinger
     */
    public function setStatusKode($statusKode)
    {
        $this->statusKode = $statusKode;

        return $this;
    }

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

    /**
     * Set statusBeskrivelse
     *
     * @param string $statusBeskrivelse
     * @return Meldinger
     */
    public function setStatusBeskrivelse($statusBeskrivelse)
    {
        $this->statusBeskrivelse = $statusBeskrivelse;

        return $this;
    }

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

    /**
     * Set statusTimestamp
     *
     * @param \DateTime $statusTimestamp
     * @return Meldinger
     */
    public function setStatusTimestamp($statusTimestamp)
    {
        $this->statusTimestamp = $statusTimestamp;

        return $this;
    }

    /**
     * Get statusTimestamp
     *
     * @return \DateTime 
     */
    public function getStatusTimestamp()
    {
        return $this->statusTimestamp;
    }
}

Instead of the built-in findBy() method of the base entity repository , I would write a DQL for such this job. 代替基本实体存储库的内置findBy()方法,我将为此工作编写DQL

For example: 例如:

$em = $this->getEntityManager();
$dql = 'SELECT K, M
        FROM Common\Entity\Konsultasjon K
        LEFT JOIN Common\Entity\Meldinger M
        WHERE K.kundeid = :kid AND
              K.state = :st AND
              K.skjult = :skj
        ORDER BY K.tag DESC,
                 M.dato DESC';

$query = $em->createQuery($dql);
$query->setParameter('kid', 1)
      ->setParameter('st', 0)
      ->setParameter('skj', 0);

 $pagination = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
 $adapter    = new \DoctrineORMModule\Paginator\Adapter\DoctrinePaginator($pagination);
 $paginator  = new \Zend\Paginator\Paginator($adapter);

 $paginator->setCurrentPageNumber(1)
           ->setDefaultItemCountPerPage(50);

 return new ViewModel(['paginator' => $paginator]);

Utilizing paginator and passing it to view layer here is a requirement since you have lot of records in both tables. 由于在两个表中都有很多记录,因此必须使用分页器并将其传递到视图层。 Also moving this logic to a custom repository (KonsultasjonRepository for example) would be good practice. 同样,将此逻辑移至自定义存储库(例如,KonsultasjonRepository)也是一种好习惯。

Hope it helps. 希望能帮助到你。

While hoping for a proper way to solve this (sorting it in my DB), here is a hack that sorts it: 希望找到解决此问题的适当方法(在我的数据库中对其进行排序),下面是对它进行排序的一种技巧:

/**
 * @param \Common\Entity\Meldinger[] $meldinger
 * @return \Common\Entity\Meldinger[]
 */
public function sortMeldinger(array $meldinger)
{
    $sort = array();
    /**
     * @var \Common\Entity\Konsultasjon $v
     */
    foreach ($meldinger as $k => $v) {
        $sort['tag'][$k] = $v->getTag();
        /** @var \Common\Entity\Meldinger $last */
        $last = $v->getMeldinger()->last();
        $sort['dato'][$k] = $last->getDato(); //end($v['meldinger'])['dato'];
    }
    array_multisort($sort['tag'], SORT_ASC, $sort['dato'], SORT_ASC, $meldinger);

    return $meldinger;
}

This sorts by my messages Date, but I could just as well have sorted by ID... 这按我的消息日期排序,但我也可以按ID排序...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM