2011-01-14 4 views
2

Рассмотрим эту модель:Как создать круговые ссылки с помощью прибора?

A: 
    columns: 
    b_id: 
     type: int 
     notnull: false 
    relations: 
    b: B 
    local: b_id 
    foreignAlias: as 


B: 
    columns: 
    a_id: 
     type: int 
     notnull: true 
    relations: 
    a: A 
    foreignAlias: bs 

Обратите внимание, что b_id может быть пустым. Возможно ли создать с одним или несколькими светильниками a Объект с отношением к объекту B, который ссылается на сам объект, и если да, то как? Более общий вопрос, можно ли:

  1. создать A
  2. создать A B
  3. Update на A

Или более просто, можно обновить объект с приспособление? После ответа Тома я попытался

[email protected]:~/project/symfony$ ./symfony doctrine:data-load update --append 
>> doctrine Loading data fixtures from "update" 
>> doctrine Data was successfully loaded 

каталог обновлений содержит приспособление, которое выглядит следующим образом:

A: 
    a_fixture_identifier: 
    b: b_fixture identifier 

после загрузки этого светильника:

A: 
    a_fixture_identifier: 

B: 
    b_fixture_identifier: 
    a: a_fixture_identifier 

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

ответ

1

Светильники предназначены для добавления некоторых данных в ваши таблицы, так что да, это все об обновлении объектов с помощью данных прибора.

Вы можете добавить эти данные в любое удобное для вас время, пока не нарушите ограничения, указанные в схеме. В случае отношений ссылочное значение (значения) должно быть указано до ссылочного значения (значений) или иначе отношение не может быть объявлено.

Это иногда бывает при загрузке сложных данных прибора из одного файла приборов. Что я заметил, чтобы обойти это, загрузите один набор приборов, затем удалите этот файл и загрузите еще один набор светильников. Другими словами, даже если отношения существуют в одном файле fixture правильно, symfony/doctrine кажется неспособным (по крайней мере в некоторых случаях) загружать их все сразу. Подумайте только о «наборах данных», а не о полной базе данных.

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

UPDATE:

Misunderstood вопрос изначально: Я не думаю, что светильники могут быть использованы, чтобы фактически обновить существующую запись. Опция «добавить» - это добавление большего количества данных в таблицу, которая уже содержит данные. Я думаю, что это отдельно, потому что, как правило, светильники будут использоваться только для таблиц, которые только что были созданы и которые вы хотите протестировать, а не для выполнения операций обновления существующих данных. Для этого я бы предложил написать отдельный скрипт.

UPDATE:

greg0ire: Я использовал это решение, и оно работает. Во-первых, я подключить command.post_command событие к моему сценарию:

$this->dispatcher->connect('command.post_command', 
    array('MmcCmsDoctrineDataLoadTaskListener', 'fixCircularReferences')); 

Тогда, в моем сценарии я проверить, что задача «данные нагрузки», и сделать недостающие звенья, чтобы замкнуть круг.

public static function fixCircularReferences(sfEvent $event) 
{ 
    /* @var $task sfTask */ 
    $task = $event->getSubject(); 
    if ($task->getName() == 'data-load') 
    { 
    // make the links here 
    } 
} 

ПРЕДУПРЕЖДЕНИЯ: Не пытайтесь создать циркуляр в светильниках, но сознательно пусть один отношение пустым, иначе вы столкнетесь с непонятными проблемами.

+0

Короче говоря, вы говорите, что я могу делать шаги 1 и 2 с одним файлом крепления, а затем обновлять запись A другим файлом прибора? Как выглядел бы файл fixture? – greg0ire

+0

Я обновил свой пост – greg0ire

+0

@ greg0ire: На самом деле, я думаю, что неправильно понял ваш оригинальный вопрос ... Я не думаю, что светильники могут быть использованы для фактического обновления существующей записи. Опция «добавить» - это добавление большего количества данных в таблицу, которая уже содержит данные. Я думаю, что это отдельно, потому что, как правило, светильники будут использоваться только для таблиц, которые только что были созданы и которые вы хотите протестировать, а не для выполнения операций обновления существующих данных. Для этого я бы предложил написать отдельный скрипт. – Tom

Смежные вопросы