Arrays 正在使用Sync替换Laravel 4中的数据透视表记录

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))

编辑:由于clod986的回答澄清了有关sync()方法的一些问题,我现在修改了代码:

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);
        }
    }
}