2016-04-22 8 views
1

と私は特定の条件で出力を照会する教義を使用したい、次の詳細Table Sample 教義クエリベースのグループ化と、最新の記録

が含まれている表「table_b」を持っています。現在、以下のブロックを使用してクエリを行っています。

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

ArrayCollection全体を出力します。最新の 'Date Created'のレコードベースを照会する方法はありますか?それは列 'Foreign Key Table 2'のグループ化に基づいています。

答えて

1

あなたはネイティブDoctrineのクエリメソッドを使用する場合は、order byパラメータでfindOneByを使用する必要があります。

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

その後、あなたはとてもあなたが最後に作成された要素

EDIT

あなたはGroupエンティティとMember実体を持っている想像し得るでしょう、ArrayCollection::first()方法を使用して、結果がArrayCollectionのだと言います。グループテーブルは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:あなたは、例2

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

与えられたグループのために作成された最後のメンバーを取得したい:あなたはすべてのメンバーが2014年1月30日に作成されますしたい:

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

それはみんなです!

PS:私は、私はカント、

+0

良い一日 をこのコードをテストしていないことは、上記の表では、Table_Bであり、その別のテーブル(table_A)との一対一の関係に多くを持っているので。私はtable_Aを最初に見つけ出す必要があります、そして、私は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(); 
}