Zend3 Doctrine Entity передает параметры - PullRequest
0 голосов
/ 09 мая 2018
+-----------------+    +------------------------------------+
|   item table    |    |          description table         |
+----+------+-----+    +----+---------+------+--------------+
| id | name | ... |    | id | item_id | lang |     text     |
+----+------+-----+    +----+---------+------+--------------+
|  1 | 1st  | ... |    |  1 |       1 |   en | english text |
+----+------+-----+    +----+---------+------+--------------+
|  2 | 2nd  | ... |    |  2 |       1 |   de | deutsch text |
+----+------+-----+    +----+---------+------+--------------+
                       |  3 |       2 |   en | english text |
                       +----+---------+------+--------------+

class Item {
   ...
   /**
    * @ORM\OneToMany(targetEntity="\Application\Entity\Desc", mappedBy="item")
    */
    protected $description;
   ...
}

class Desc {
   ...
   /**
    * @ORM\ManyToOne(targetEntity="\Application\Entity\Item", inversedBy="description")
    * @ORM\JoinColumn(name="item_id", referencedColumnName="id")
    */
    protected $item;

    /**
     * @ORM\Column(name="text")
    protected $text;

    public function getDesc(/*passing lang*/)
    {
        //there returned array of values, not single result
        return $this->text;
    }
   ...
}

У меня два стола с родственниками OneToMany. Я установил тег комментария @ORM в сущности и успешно получил массив описаний в сущности элемента (EN и De lang). Как я могу получить только одно описание языка, передавая аргумент языка в сущность описания без итерации массива и лишней строки SQL в запросе БД?

1 Ответ

0 голосов
/ 10 мая 2018

В классе Item вы можете сделать что-то вроде этого, которое будет возвращать только описание с указанным языковым параметром:

/**
 *
 * @return \Application\Entity\Desc
 */
public function getDescByLanguage($language)
{
    $criteria = Criteria::create()
        ->where(Criteria::expr()->eq("lang", $language))
        ->setFirstResult(0)
        ->setMaxResults(1);

    $descByLanguage = $this->description->matching($criteria);

    return $descByLanguage[0];
}
...