Arrays 正在使用Sync替换Laravel 4中的数据透视表记录
编辑:由于clod986的回答澄清了有关sync()方法的一些问题,我现在修改了代码:Arrays 正在使用Sync替换Laravel 4中的数据透视表记录,arrays,laravel-4,associative-array,Arrays,Laravel 4,Associative Array,编辑:由于clod986的回答澄清了有关sync()方法的一些问题,我现在修改了代码: public function attachDelegates($eventId, $delegates) { $event = $this->find($eventId); foreach ($delegates as $key => $value) { if( ! $event->delegates->contains($key))
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张桌子:
事件、委托、未知数和称为委托事件的透视表
在应用程序中,您可以在事件中存储多个未知代理,也可以根据您按下的按钮存储一个未知代理
我遇到的问题是,当第一次存储一个未知代理时,它工作得很好,但一旦您尝试存储另一个未知代理,它会将委托和未知存储在各自的表中,但当涉及到将委托与委托事件表上的事件同步时,它会替换/更新以前的记录。添加多个未知代理可以正常工作
这是我的密码:
// 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);
}
同样,这在传递给sync方法时也可以正常工作。它在数据透视表上存储所有正确的委托关系
存储单个未知委托时,$delegates数组如下所示:
array(1) {
[4] array(4) {
["delegate_status_id"] "1"
["price"] "3000"
["prerequisites"] "on"
["booking_id"] NULL
}
}
同样,这可以正常工作一次,但一旦您尝试添加另一个,它就会用新ID替换/更新记录
谁能给我指一下正确的方向吗?谢谢。这是Laravel 4的预期行为:在
->sync($array)
结束时,您将只拥有数组中的项目。更多细节
您应该使用另一种方法:检查项目是否在集合中,否则添加它
public function syncDelegates($eventId, $delegates){
$event = $this->find($eventId);
foreach($delegates as $key => $value){
if(!$event->delegates->contains($value)){
$event->delegates()->attach($value);
}
}
}
这将添加您缺少的项目Hmmm!为什么使用完全相同的代码添加倍数时效果会很好?啊!忽略最后一条消息,我明白它的意思了,我错过了:“只有数组中的ID才会出现在模型的中间表上”同样,我也不确定这段代码是否有效,因为我需要将透视数据附加到透视表上的每个委托上。感谢帮助和指针,我添加了修改后的代码,现在可以解决我上面的问题了。谢谢你,伙计。@Gaz没问题。您需要有关pivot数据的帮助吗?
public function syncDelegates($eventId, $delegates){
$event = $this->find($eventId);
foreach($delegates as $key => $value){
if(!$event->delegates->contains($value)){
$event->delegates()->attach($value);
}
}
}