2015-04-24 1 views
2

В настоящее время я сталкиваюсь с некоторыми проблемами с утилизацией учения. Я использую ZF2 для создания API, и поэтому мне нужно собрать некоторые запросы, которые используют объединения.Доктрина Гидрат присоединился к объектам в одну запись массива

Сейчас они выглядят примерно так:

$qb->select(array('r, a')) 
    ->from('Release\Entity\Release', 'r') 
    ->leftJoin(
     'Artist\Entity\Artist', a', 
     \Doctrine\ORM\Query\Expr\Join::WITH, 'a.id = r.artist' 
    ) 
    ->orderBy('r.id', 'ASC'); 

Так что, если я увлажняю результат с AbstractQuery::HYDRATE_ARRAY результатом будет дополнительным элементом массива для каждой присоединяемой таблицы/сущности.

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [artist] => 1 
      [title] => A super nice Release 
      [digital_release] => DateTime Object 
       (
        [date] => 2014-01-25 00:00:00.000000 
        [timezone_type] => 3 
        [timezone] => Europe/Berlin 
       ) 

      [physical_release] => DateTime Object 
       (
        [date] => 2014-01-25 00:00:00.000000 
        [timezone_type] => 3 
        [timezone] => Europe/Berlin 
       ) 

     ) 

    [1] => Array 
     (
      [id] => 1 
      [first_name] => John 
      [last_name] => Doe 
      [artist_name] => JD and the Beat-Machines 
      [created_at] => DateTime Object 
       (
        [date] => 2015-04-17 13:16:18.000000 
        [timezone_type] => 3 
        [timezone] => Europe/Berlin 
       ) 

      [updated_at] => DateTime Object 
       (
        [date] => 2015-04-17 13:16:18.000000 
        [timezone_type] => 3 
        [timezone] => Europe/Berlin 
       ) 

     ) 

    [2] => Array 
     (
      [id] => 2 
      [artist] => 14 
      [title] => Some other nice album 
      [digital_release] => DateTime Object 
       (
        [date] => 2014-02-01 00:00:00.000000 
        [timezone_type] => 3 
        [timezone] => Europe/Berlin 
       ) 

      [physical_release] => DateTime Object 
       (
        [date] => 2014-02-01 00:00:00.000000 
        [timezone_type] => 3 
        [timezone] => Europe/Berlin 
       ) 

     ) 

    [...] 
) 

Как вы можете видеть художника соответствующего выпуска [0] хранится в массиве ключа [1].

Если я окончательно распечатаю результат как новый JsonModel($result), это не представляется мне возможным.

Что я хочу достичь, это какой-то результат, как этот

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [artist] => Array 
        (
         [id] => 1 
         [first_name] => John 
         [last_name] => Doe 
         [artist_name] => JD and the Beat-Machines 
         [created_at] => DateTime Object 
          (
           [date] => 2015-04-17 13:16:18.000000 
           [timezone_type] => 3 
           [timezone] => Europe/Berlin 
          ) 

         [updated_at] => DateTime Object 
           (
            [date] => 2015-04-17 13:16:18.000000 
            [timezone_type] => 3 
            [timezone] => Europe/Berlin 
          ) 

        ) 
      [title] => A super nice Release 
      [digital_release] => DateTime Object 
       (
        [date] => 2014-01-25 00:00:00.000000 
        [timezone_type] => 3 
        [timezone] => Europe/Berlin 
       ) 

      [physical_release] => DateTime Object 
       (
        [date] => 2014-01-25 00:00:00.000000 
        [timezone_type] => 3 
        [timezone] => Europe/Berlin 
       ) 
     ) 

    [2] => Array 
     (
      [id] => 2 
      [artist] => Array 
        (
         [id] => 14 

         [...] 

        ) 
      [title] => Some other nice album 
      [digital_release] => DateTime Object 
       (
        [date] => 2014-02-01 00:00:00.000000 
        [timezone_type] => 3 
        [timezone] => Europe/Berlin 
       ) 

      [physical_release] => DateTime Object 
       (
        [date] => 2014-02-01 00:00:00.000000 
        [timezone_type] => 3 
        [timezone] => Europe/Berlin 
       ) 

     ) 

    [...] 
) 

Может быть, кто-то полезный совет, как получить такой выход :)

Я уже пытался использовать AbstractQuery::HYDRATE_SCALAR, который приходит немного ближе к тому, что я хочу, но результат объединенной таблицы не является подматрицей объединенного столбца.

Заранее спасибо за каждый полезный намек :)

С уважением

ответ

1

Ваша проблема ваше отображение это не хорошо я думаю, что вы не имеете отношение между Release и художника.

Вы должны установить отношение OneToMany между Artist и Release. Как это:

On artist side 
/** 
* @ORM\OneToMany(targetEntity="Release\Entity\Release", mappedBy="artist") 
*/ 
protected $release; 

And Release side 
/** 
* @ORM\ManyToOne(targetEntity="Artist\Entity\Artist", inversedBy="release") 
* @ORM\JoinColumn(name="artist", referencedColumnName="idArtist", onDelete="RESTRICT") 
*/ 
protected $artist; 

Не забудьте стороне художника создать экземпляр коллекции, как это:

public function __construct() 
{ 
    $this->release= new ArrayCollection(); 
} 

с этим использование:

use Doctrine\Common\Collections\ArrayCollection; 

С этим вы можете установить ваш пресс-релиз и установить исполнителя с объектом художника. У вас будет тот результат, который вы хотите.

$release = new Release; 
$artist = new Artist; 
$release->setArtist($artist); 

EDIT Если у вас есть ваши данные, вы должны заполнить вашу сущность с ним.

Если у вас есть Форма, вы должны использовать DoctrineHydrator для достижения этого, ваш объект будет правильно гидратирован из вашей формы. Это может потребоваться, чтобы вникнуть в документацию доктрины;) Если ваши данные поступают откуда угодно, вы можете заполнить свою сущность сеттерами вашего объекта.

Для например:

$relaseEntity->setDate($data['date']); // Be carefull to Datetime object for this 
$releaseEntity->setName($data['name']); 

И продолжается ...

+0

Эй Hooli, спасибо за полезный комментарий по этому вопросу! Итак, ваш пример сопоставления работает хорошо, но в действии - когда я делаю новый экземпляр выпуска - я действительно не знаю, как заполнить объект Entity-Object моими данными. Я имею в виду: новый Release означает один элемент, но мой запрос строит список всех элементов в запросе. поэтому я получил свой запрос $, который содержит результат всего моего запроса (который выполняется с QueryBuilder), а с другой стороны, у меня есть этот хороший, но пустой объект-объект ... Возможно, немой вопрос, но: Как сделать вы объединяете эти две вещи? – bquarta

+0

@bquarta i отредактировал мое сообщение – Hooli

+0

Извините за поздний ответ: Я попробовал, и он работает для самого объекта. Но я не могу передать объект как jsonModel, так как свойства объекта защищены, а json для них будет пустым. Если этот последний шаг будет работать, тогда все будет хорошо. – bquarta