Более простой способ сохранения объектов таблицы соединения с использованием Symfony и DoctrinePhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Более простой способ сохранения объектов таблицы соединения с использованием Symfony и Doctrine

Сообщение Anonymous »

В Symfony 2 и Doctrine 2.1 у меня есть две сущности и одна промежуточная сущность (объединяемая таблица): User, Pref и UsersPrefs. Table Pref — это словарная таблица, поэтому я могу изменить имя pref только в одном месте.
инфографика http://dl.dropbox.com/u/22495762/infographic.png
Мне нужна группа флажков со всеми возможными вариантами (предпочтениями) и предпочтительными вариантами. Если есть 3 настройки и 2 выбраны пользователем, должно быть 3 флажка, 2 выбраны.
Если все сделано на простом PHP: дважды запросите базу данных, чтобы получить список всех настроек и пользовательские настройки, отображение флажков в зависимости от значений и добавление некоторых действий для обработки отправки формы.
Но мне не удалось заставить это работать с помощью Symfony и Doctrine. Я мог бы обновить отношения в Doctrine и базе данных, но используя необработанный запрос:

Код: Выделить всё

$data = $request->request->get('some_form');
и, предположительно, это не так, как следует делать.
Я застрял в том, как мне отображать список флажков. Я либо получил список всех параметров (ни один не выбран), либо только параметры пользователя, все отмечены, либо результат левого объединения с флажками для всех параметров.
Я попытался перегрузить шаблон флажка ветки. , но мне не удалось передать переменные в шаблон формы.
Получается группа флажков, не связанных с выбором пользователя:

Код: Выделить всё

->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 в сущность «Пользователь».
Затем я установил значения в массиве в соответствии с предпочтениями, выбранными пользователем:

Код: Выделить всё

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();
Какой способ проще?

Подробнее здесь: https://stackoverflow.com/questions/941 ... d-doctrine
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»