2016-04-22 34 views
1

我有一个表“表-B”包含以下细节Table Sample 主义查询底座采用分组和最新记录

我想用理论来查询的输出与特定的条件。目前我正在使用下面的块进行查询。

$table_a= $em->getRepository('table_a')->findOneBy(['id'=>1]); 
foreach($table_a->table_b as $records){ 
    echo $records->name. " : " . $records->value; 
} 

它会输出整个ArrayCollection。有没有办法根据最新的'创建日期'来查询记录库,这是基于'外键表2'列的分组。

回答

1

如果要使用本机学说查询方法,你应该使用findOneByorder by参数。

findOneBy(['id' => 1], ['DateCreated' => 'desc']) 

然后,你说结果是一个ArrayCollection,因此,使用ArrayCollection::first()方法,你会得到最后创建的元素

编辑

假设你有一个Group实体和Member实体。组表是你的table_a和成员表是你的table_b

实体描述应该是类似的东西:

class Group 
{ 
    ... 

    /** 
    * @ORM\OneToMany(targetEntity="Group", mappedBy="member", cascade={"persist", "remove", "merge"}) 
    * @ORM\OrderBy({"dateCreated"="DESC"}) 
    */ 
    protected $members; 

    ... 

    public function __construct() 
    { 
     $members = new ArrayCollection(); 
    } 

    // members handling accessors 

    /** 
    * @return ArrayCollection 
    */ 
    public function getMembers() 
    { 
     return $this->members; 
    } 

    /** 
    * @param $members 
    * 
    * @return $this 
    */ 
    public function setMembers($members) 
    { 
     $this->members = new ArrayCollection(); 

     return $this->addMembers($members); 
    } 

    /** 
    * @param $members 
    * 
    * @return $this 
    */ 
    public function addMembers($members) 
    { 
     foreach ($members as $member) 
     { 
      $this->addMember($member); 
     } 

     return $this; 
    } 

    /** 
    * @param Member $member 
    * 
    * @return $this 
    */ 
    public function addMember(Member $member) 
    { 
     $this->members->add($member); 
     $member->setGroup($this); 

     return $this; 
    } 

    /** 
    * @param Member $member 
    * 
    * @return $this 
    */ 
    public function removeMember(Member $member) 
    { 
     if ($this->members->contains($member)) 
     { 
      $this->members->removeElement($member); 
     } 

     return $this; 
    } 

    /** 
    * @param $members 
    * 
    * @return $this 
    */ 
    public function removeMembers($members) 
    { 
     foreach ($members as $member) 
     { 
      $this->removeMember($member); 
     } 

     return $this; 
    } 
} 

和会员单位:

class Member 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Group", inversedBy="members") 
    * @ORM\JoinColumn(name="group_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    protected $group; 

    /** 
    * @ORM\Column(type="datetime", name="date_created") 
    */ 
    protected $dateCreated; 

    /** 
    * @return Group 
    */ 
    public function getGroup() 
    { 
     return $this->group; 
    } 

    /** 
    * @param Group $group 
    * 
    * @return $this 
    */ 
    public function setGroup(Group $group) 
    { 
     $this->group = $group; 

     return $this; 
    } 
} 

现在,我们有一个组成员的dateCreated有序集合。

示例1:您想获得给定组

$group = $em->getRepository(Group::class)->findOneBy(['id' => 1]); 
$lastMember = $group->getMembers()->first(); 

例2中创建的最后一个成员:你想在2014年1月30日创建的所有成员:

$members = $group->getMembers()->filter(function (Member $member) { 
    return ($member->getDateCreated->format('Y-m-d') == '2014-01-30'); 
}); 

这都是民间的!

PS:我还没有测试此代码

+0

美好的一天, 我不能这样做,因为上面的表是表-B和它有许多与另一个表(表-A)的一个关系。我需要找到table_A 1st,然后我只能在Table_B中查找项目。 – WyHowe

+0

请问,你能提供你的实体描述吗? – ceadreak

+0

检查我的编辑是否有ArrayCollection的示例 – ceadreak

0

在TableRepository:

public function getLatestRecord() 
{ 
    return $this->getEntityManager() 
     ->createQuery('SELECT t FROM MyBundle:MyEntity t GROUP BY t.table2NameField ORDER BY t.created DESC') 
     ->setMaxResults(1) 
     ->getOneOrNullResult(); 
}