Синхронизация Laravel hasMany с массивом ownTo

Доброго времени суток всем! Суть моей проблемы заключается в следующем: есть две модели Contact и PhoneNum! отношения в моделях:

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    protected $table = 'contacts';
    public function phoneNums()
    {
        return $this->hasMany('App\Models\PhoneNum');
    }
}

Модель PhoneNum

class PhoneNum extends Model
{
    protected $table = 'phoneNums';
    protected $fillable = ['phone_num'];

    public function contact()
    {
        return $this->belongsTo('App\Models\Contact');
    }
}

В форме редактирования контакта я получаю его имя и массив с номерами телефонов этого контакта.

ContactController

public function update(Request $request, $id)
{
    $contact = Contact::find($id);
    $contact->name = $request->name;
    $contact->save();

    //what should I do with the array $request->phoneNums ????

    return redirect('/');
}

Я не могу синхронизировать эти новые телефонные номера с контактом по id. ты можешь помочь мне с этим?

3 ответа

Сначала вы должны удалить старые контакты, а затем вставить вновь созданные.

$contact->phoneNums()->delete();
$contact->phoneNums()->saveMany([$request->input('phoneNums')]);

Прежде всего: изменить $request->name в $request->input('name'), С этим изменением через 5 месяцев вы узнаете, что эта переменная исходит из формы.

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

foreach($request->input('phoneNums') as $phoneNumber){
    $contact->phoneNums()->create([
        'number' => $phoneNumber
    ]);
}

И посмотрите на правила PSR, чтобы вы могли сделать свой код более удобным для чтения: http://www.php-fig.org/psr/.

Добавьте метод синхронизации для обновления функции, как показано ниже

Public function update(Request $request, $id)

{
    $contact = Contact::find($id);
    $contact->name = $request->name;
    $contact->save();
    $contact->phoneNums()->sync($request->phoneNums, true)

    return redirect('/');
} 
Другие вопросы по тегам