Symfony 3从现在开始找到最接近的日期

时间:2016-06-06 01:04:03

标签: php mysql symfony

我有三个数据库表。用户,会议,组。会议和组表是用户表中的许多关联。
所以我可以user->getmeetings()user->getgroups()

我想让下一次会议为用户做好准备,而我不知道如何实现这一目标。无论是通过SQL Query还是仅仅在控制器中。这是我到目前为止所做的。

$loggedInUser = $em->getRepository('AppBundle\Entity\User')
        ->find($id);

    foreach ($loggedInUser->getMeetings() as $userMeetings) {
        $nextMeeting[$userMeetings->getId()]['id'] = $userMeetings->getId();
        $nextMeeting[$userMeetings->getId()]['group'] = $userMeetings->getGroup();
        $nextMeeting[$userMeetings->getId()]['name'] = $userMeetings->getName();
        $nextMeeting[$userMeetings->getId()]['info'] = $userMeetings->getInfo();
        $nextMeeting[$userMeetings->getId()]['bring'] = $userMeetings->getBring();
        $nextMeeting[$userMeetings->getId()]['summary'] = $userMeetings->getSummary();
        $nextMeeting[$userMeetings->getId()]['files'] = $userMeetings->getFiles();
        $nextMeeting[$userMeetings->getId()]['meetingDate'] = $userMeetings->getMeetingDate();
        $nextMeeting[$userMeetings->getId()]['meetingAddress'] = $userMeetings->getMeetingAddress();
        $nextMeeting[$userMeetings->getId()]['time_diff'] = date_diff($userMeetings->getMeetingDate(), new \DateTime());
    }

我在新数组中添加了time_diff字段来计算从现在到会议时间的时间。我现在需要做的就是选择最小的一个。
我该怎么做?谢谢。

更新 - 以下是我的用户存储库

namespace AppBundle\Repository;

use AppBundle\Entity\User;
use AppBundle\Entity\Meeting;
use Doctrine\ORM\EntityRepository;
use Doctrine\Common\Collections\Criteria;

class UserRepository extends EntityRepository
{
    public function getComingMeeting()
    {
        $criteria = Criteria::create()
            ->where(Criteria::expr()->gte("meetingDate", new \DateTime('now')))
            ->orderBy(array("meetingDate" => Criteria::ASC))
            ->setMaxResults(1);
    $this->getMeetings()->matching($criteria);
}
}

以下是我的用户实体

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 * @ORM\Table(name="user")
 */
class User
{

/**
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @ORM\Column(type="string", nullable=false)
 */
private $first_name;

/**
 * @ORM\Column(type="string", nullable=false)
 */
private $last_name;

/**
 * @ORM\Column(type="string", nullable=false, unique=true)
 */
private $email_address;

/**
 * @ORM\Column(type="string", nullable=true)
 */
private $phone_number;

/**
 * @ORM\Column(type="string", nullable=false)
 */
private $password;

/**
 * @ORM\Column(type="datetime", nullable=true)
 */
private $last_login;

/**
 * @ORM\Column(type="string", nullable=true)
 */
private $reset_password;

/**
 * @ORM\ManyToMany(targetEntity="Meeting", inversedBy="users")
 */
private $meetings;

/**
 * @ORM\ManyToMany(targetEntity="Group", inversedBy="users")
 */
private $groups;

public function __construct()
{
    $this->groups = new arrayCollection();
    $this->meetings = new arrayCollection();
}

/**
 * @return mixed
 */
public function getFirstName()
{
    return $this->first_name;
}

/**
 * @param mixed $first_name
 */
public function setFirstName($first_name)
{
    $this->first_name = $first_name;
}

/**
 * @return mixed
 */
public function getLastName()
{
    return $this->last_name;
}

/**
 * @param mixed $last_name
 */
public function setLastName($last_name)
{
    $this->last_name = $last_name;
}

/**
 * @return mixed
 */
public function getEmailAddress()
{
    return $this->email_address;
}

/**
 * @param mixed $email_address
 */
public function setEmailAddress($email_address)
{
    $this->email_address = $email_address;
}

/**
 * @return mixed
 */
public function getPhoneNumber()
{
    return $this->phone_number;
}

/**
 * @param mixed $phone_number
 */
public function setPhoneNumber($phone_number)
{
    $this->phone_number = $phone_number;
}

/**
 * @return mixed
 */
public function getPassword()
{
    return $this->password;
}

/**
 * @param mixed $password
 */
public function setPassword($password)
{
    $this->password = $password;
}

/**
 * @return mixed
 */
public function getLastLogin()
{
    return $this->last_login;
}

/**
 * @param mixed $last_login
 */
public function setLastLogin($last_login)
{
    $this->last_login = $last_login;
}

/**
 * @return mixed
 */
public function getResetPassword()
{
    return $this->reset_password;
}

/**
 * @param mixed $reset_password
 */
public function setResetPassword($reset_password)
{
    $this->reset_password = $reset_password;
}

/**
 * @return arrayCollection|Meeting[]
 */
public function getMeetings()
{
    return $this->meetings;
}

/**
 * @return ArrayCollection|Group[]
 */
public function getGroups()
{
    return $this->groups;
}

/**
 * @return mixed
 */
public function getId()
{
    return $this->id;
}



}

下面是我的HomeControlller.php

class HomeController extends Controller
{

/**
 * @Route("/home", name="home_show")
 */
public function showAction()

{
    $em = $this->getDoctrine()->getManager();

    //logged in user
    $id = 1;

    $loggedInUser = $em->getRepository('AppBundle\Entity\User')
        ->find($id);

    foreach ($loggedInUser->getMeetings() as $userMeetings) {
        $nextMeeting[$userMeetings->getId()]['id'] = $userMeetings->getId();
        $nextMeeting[$userMeetings->getId()]['group'] = $userMeetings->getGroup();
        $nextMeeting[$userMeetings->getId()]['name'] = $userMeetings->getName();
        $nextMeeting[$userMeetings->getId()]['info'] = $userMeetings->getInfo();
        $nextMeeting[$userMeetings->getId()]['bring'] = $userMeetings->getBring();
        $nextMeeting[$userMeetings->getId()]['summary'] = $userMeetings->getSummary();
        $nextMeeting[$userMeetings->getId()]['files'] = $userMeetings->getFiles();
        $nextMeeting[$userMeetings->getId()]['meetingDate'] = $userMeetings->getMeetingDate();
        $nextMeeting[$userMeetings->getId()]['meetingAddress'] = $userMeetings->getMeetingAddress();
        $nextMeeting[$userMeetings->getId()]['time_diff'] = date_diff($userMeetings->getMeetingDate(), new \DateTime());
    }


    $groups = $em->getRepository('AppBundle\Entity\Group')
        ->findAll();

    return $this->render('home/show.html.twig', [
        'loggedInUser' => $loggedInUser,
        'groups' => $groups,
    ]);
}

}

1 个答案:

答案 0 :(得分:1)

您可以在UserEntity中添加一个方法,其中包含会议集合的匹配条件

namespace AppBundle\Entity;

use Doctrine\Common\Collections\Criteria;

....

public function getComingMeeting()
{
   $criteria = Criteria::create()
     ->where(Criteria::expr()->gte("meetingDate", new \DateTime('now')))
     ->orderBy(array("meetingDate" => Criteria::ASC))
     ->setMaxResults(1);

  return $this->getMeetings()->matching($criteria);
}

请参阅http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/working-with-associations.html