Symfony 2, как сохранить объединение таблиц сущностей? - PullRequest
2 голосов
/ 23 февраля 2012

Это такая банальная проблема, что я не могу поверить, что не смог найти ответ.

Symfony 2, учение 2.1. У меня есть две сущности и одна промежуточная сущность (таблица соединений). User, Pref и UsersPrefs. Pref table - это словарная таблица, так что я могу изменить имя pref только в одном месте. Хорошо, давайте посмотрим на картинку:

инфографика http://dl.dropbox.com/u/22495762/infographic.png

Как видите, я хочу иметь группу флажков, со всеми возможными вариантами (префсами) и предпочтительными вариантами. Таким образом, если пользователь выбрал 3 префа и только 2 выбрал, то должно быть 3 флажка, 2 выбраны.

Это просто, если сделать простой PHP - дважды запросить базу данных, чтобы получить список всех преферсов и пользовательских преференций, отобразить флажки в зависимости от значений, добавить некоторые действия для обработки отправки формы, готово.

Но ради жизни Бога я не могу заставить это работать, используя symfony & доктрину. Мне удалось добраться до точки, где я могу обновить отношения в доктрине и далее в базе данных, но для этого я использую необработанные значения запроса:

$data = $request->request->get('some_form');

а это якобы не так, как должно быть?

Morevoer, я полностью застрял в том, как я должен отображать список флажков. Я либо получаю список всех опций, ни один не отмеченный, или только пользовательские опции, все проверенные. Или набор результатов 'left join' с флажками для всех случаев, в любом случае бесполезный.

Я дошел до того, что попытался перегрузить шаблон флажка ветки, но не смог передать переменные в шаблон формы, и это было последней каплей ...

EDIT:

Таким образом, я получаю группу флажков, не связанных с выбором пользователя:

->add('prefs', 'entity', array(
            'class' => 'Some\TestBundle\Entity\Pref',
            'expanded' => 'true',
            'multiple' => 'true',
            'property' => 'name'                        
            ))

И таким образом я получаю только выбор пользователя, все проверено:

->add('prefs', 'entity', array(
            'class' => 'Some\TestBundle\Entity\UserPrefs',
            'multiple' => 'false',
            'expanded' => 'false',
            'property' => 'pref.name',
            'query_builder' => function(EntityRepository $er) use ($id) {
                                    return $er->createQueryBuilder('u')
                                        ->where("u.user = :id")
                                        ->setParameter('id', $id)
                                    ;
                                },

        ))

И я пробовал левые соединения и другие опции, но в лучшем случае я мог получить список всех возможных опций для всех возможных пользователей, отмеченных соответствующим образом.

РЕДАКТИРОВАТЬ (ВОЗМОЖНОЕ РЕШЕНИЕ):

Я показываю флажок группы:

->add('pref_ids', 'choice', array(
        'choices'   => array(
            '1'   => 'pref one',
            '2' => 'pref two',
            '3'   => 'pref three',
        ),
        'expanded' => 'true',
        'multiple' => 'true'                       
        ))

Я добавил массив $pref_ids в сущности User. Теперь мне просто нужно установить значения в массиве в соответствии с предпочтениями, выбранными пользователем:

public function setPrefIds()
  {
    $prefs = $this->getPrefs();
    $this->pref_ids = array();
    foreach($prefs as $pref){
        array_push($this->pref_ids, $pref->getPref()->getId());
    }
    return $this;
  }

Таким образом, я проверяю соответствующие флажки.

Запись значений в базу данных является обращением процесса. Я получаю входные значения из запроса:

$data = $request->request->get('edit_form');
var_dump($data['pref_ids']);

Удаление всех пользовательских настроек:

foreach ($userPrefs as $pref){
$em->remove($pref);
}

И установление фактических ассоциаций в доктрине из идентификаторов:

$entity->setPrefsById($em, $data['pref_ids']);

Здесь я передаю менеджер сущностей самой сущности, но мне нужно его реорганизовать, потому что это выглядит немного грязно.

Тогда $em->flush(); и все.

Это лучшее, что я мог придумать. Вероятно, это слишком сложно и должно быть сделано совершенно по-другому. К сожалению, не смог понять этот «другой путь».

1 Ответ

0 голосов
/ 23 февраля 2012

Вам нужен тип поля выбора: http://symfony.com/doc/current/reference/forms/types/choice.html

В вашем конструкторе это будет что-то вроде

$builder->add('prefs', 'choice', array('multiple' => true, 'expanded' => true, 'choices' => fetch the available prefs from the database here);

Редактировать: Извините, я ошибаюсь, вам нужен "Entity"type, который автоматически выбирает варианты из базы данных: http://symfony.com/doc/current/reference/forms/types/entity.html

Вы все равно должны поставить несколько => true extended => true, чтобы получить флажки.

...