EDIT: Спасибо к ответу на clod986, который очистил несколько вещи о методе синхронизации(), я теперь изменил мой код:сводной таблицы отчеты заменяются в Laravel 4 Использование синхронизации
public function attachDelegates($eventId, $delegates)
{
$event = $this->find($eventId);
foreach ($delegates as $key => $value)
{
if(! $event->delegates->contains($key))
{
$event->delegates()->attach($key, array(
'delegate_status_id' => $value['delegate_status_id'],
'price' => $value['price'],
'prerequisites' => $value['prerequisites'],
'booking_id' => $value['booking_id']
));
}
}
}
у меня есть 4 таблицы:
события, делегаты, неизвестных и сводная таблица называется delegate_event
в приложении вы можете или хранить несколько неизвестных делегатов о событиях или один неизвестный делегат в зависимости от ВАЗы t нажмите.
Проблема, с которой я столкнулась, заключается в том, что при первом хранении одного неизвестного делегата он отлично работает, но как только вы попытаетесь сохранить еще один неизвестный делегат, он сохранит делегат и неизвестно в своих соответствующих таблицах, но когда дело доходит до синхронизации делегата с событием в таблице delegate_event, оно заменит/обновит предыдущую запись. Добавление нескольких неизвестных делегатов отлично работает.
Вот мой код:
// Filename: AdminDelegatesController.php
// Selection: 1
public function store()
{
$delegateData = Input::except(array('delegate_status_id', 'price', 'event_id', 'account_id', 'amount'));
$eventId = Input::get('event_id');
$event = $this->event->find($eventId);
$amount = Input::get('amount');
if (! empty($amount))
{
$message = (object) array(
'title' => 'Excellent!',
'content' => 'The unknown delegates were successfully added to the event.',
'alert_type' => 'success'
);
$price = Input::get('price')/$amount;
$data = array(
'delegate_status_id' => Input::get('delegate_status_id'),
'price' => $price,
'prerequisites' => 'on'
);
$unknowns = array();
for ($i = 0; $i < $amount; $i++)
{
$unknownKey = 'unknown-'.$event->start_date->toDateString().'-'.(int) rand(0,9999);
$data['key'] = $unknownKey;
$unknowns[] = $data;
}
$unknownData = $this->unknown->storeUnknowns($unknowns);
$delegates = $this->delegate->storeDelegates(null, $unknownData, $eventId, null);
$this->event->storeDelegates($eventId, $delegates);
}
else
{
$message = (object) array(
'title' => 'Excellent!',
'content' => 'The unknown delegate was added successfully to the event.',
'alert_type' => 'success'
);
$unknownKey = 'unknown-'.$event->start_date->toDateString().'-'.(int) rand(0,9999);
$data = array(
'key' => $unknownKey,
'delegate_status_id' => Input::get('delegate_status_id'),
'price' => Input::get('price'),
'prerequisites' => 'on'
);
$unknowns = array($data);
$unknownData = $this->unknown->storeUnknowns($unknowns);
$delegate = $this->delegate->storeDelegates(null, $unknownData, $eventId, null);
$this->event->syncDelegates($eventId, $delegate);
}
return Redirect::back()->with('message', $message);
}
// Filename: Unknown.php
// Selection: 1
public function storeUnknowns($unknowns)
{
if (is_null($unknowns))
{
return null;
}
foreach ($unknowns as $unknown) {
$delegate = $this->create(array('key' => $unknown['key']));
$data[$delegate->id]['delegate_status_id'] = $unknown['delegate_status_id'];
$data[$delegate->id]['price'] = $unknown['price'];
$data[$delegate->id]['unknown_id'] = $delegate->id;
if (empty($unknown['prerequisites']))
{
$data[$delegate->id]['prerequisites'] = '0';
}
else
{
$data[$delegate->id]['prerequisites'] = $unknown['prerequisites'];
}
}
return $data;
}
// Filename: Delegate.php
// Selection: 1
public function storeDelegates($contactData, $unknownData, $eventId, $bookingId)
{
$delegates = array();
if (!is_null($contactData))
{
foreach ($contactData as $contact)
{
$delegate = $this->create(array('contact_id' => $contact['contact_id'], 'unknown_id' => '0'));
$delegates[$delegate->id]['delegate_status_id'] = $contact['delegate_status_id'];
$delegates[$delegate->id]['price'] = $contact['price'];
$delegates[$delegate->id]['prerequisites'] = $contact['prerequisites'];
$delegates[$delegate->id]['booking_id'] = $bookingId;
}
}
if (!is_null($unknownData))
{
foreach ($unknownData as $unknown)
{
$delegate = $this->create(array('contact_id' => '0', 'unknown_id' => $unknown['unknown_id']));
$delegates[$delegate->id]['delegate_status_id'] = $unknown['delegate_status_id'];
$delegates[$delegate->id]['price'] = $unknown['price'];
$delegates[$delegate->id]['prerequisites'] = $unknown['prerequisites'];
$delegates[$delegate->id]['booking_id'] = $bookingId;
}
}
return $delegates;
}
// Filename: Event.php
// Selection: 1
public function syncDelegates($eventId, $delegates)
{
$event = $this->find($eventId);
return $event->delegates()->sync($delegates);
}
При добавлении нескольких неизвестных делегатов в результате $ делегатов массив выглядит примерно так:
array(3) {
[1] array(4) {
["delegate_status_id"] "2"
["price"] 250
["prerequisites"] "on"
["booking_id"] NULL
}
[2] array(4) {
["delegate_status_id"] "2"
["price"] 250
["prerequisites"] "on"
["booking_id"] NULL
}
[3] array(4) {
["delegate_status_id"] "2"
["price"] 250
["prerequisites"] "on"
["booking_id"] NULL
}
}
Опять же, это хорошо работает, когда передается синхронизации метода. Он сохраняет все правильные отношения делегата в сводной таблице.
При сохранении одного неизвестного делегата, массив $ делегатов выглядит следующим образом:
array(1) {
[4] array(4) {
["delegate_status_id"] "1"
["price"] "3000"
["prerequisites"] "on"
["booking_id"] NULL
}
}
Опять же, это работает отлично один раз, но как только вы пытаетесь добавить еще один, он заменяет/обновляет запись с новым идентификаторы.
Может ли кто-нибудь указать мне в правильном направлении, пожалуйста? Благодарю.
Ммм! Почему при добавлении кратных чисел с использованием одного и того же кода он отлично работает? –
Ах! Игнорируйте последнее сообщение, я вижу, что это значит, я пропустил: «только идентификаторы в массиве будут на промежуточной таблице для модели» –
Кроме того, не уверен, что этот код будет работать, так как мне нужно прикрепить сводные данные к каждому делегата на сводной таблице. –