Правильный синтаксис для вставки / обновления Laravel Eloquent - PullRequest
0 голосов
/ 03 июля 2018

У меня, казалось бы, простая проблема, которую я все еще не могу решить после нескольких дней просмотра. Скажем, у меня есть модель Debitur.

class Debitur extends Model
{
    protected $table = 'debiturs';
    protected $fillable = [
        'name', 'address',
    ];

    public function debiturWife(){
        return $this->hasOne('App\DebiturWife');
    }
}

И у меня есть модель DebiturWife.

class DebiturWife extends Model
{
    protected $table = 'debitur_wifes';
    protected $fillable = [
        'nama', 'address', 'photo',
    ];

    public function debitur(){
        return $this->belongsTo('App\Debitur');
    }
}

Я могу получить данные Debitur и DebiturWife в DebiturController следующим образом:

return Debitur::with('debiturWife')->find($debitur_id);

Теперь я хочу создать новую Debitur и DebiturWife, как мне это сделать? Что-то вроде

$debitur = new Debitur;
$debitur->name = $request->name;
$debitur_wife = new Debitur.DebiturWife; //obviously doesn't work

Ответы [ 3 ]

0 голосов
/ 03 июля 2018
$debitur = new Debitur;
$debitur->name = $request->name;
$debitur->save();

$debitur_wife = new DebiturWife([
    'name' => 'Foo'
]);

$debitur->debiturWife()->save($debitur_wife);

Документация

Что если позже я захочу обновить DebiturWife на основе идентификатора Debitur?

$debitur = Debitur::with('debiturWife')->find($id);
$debitur->debiturWife->name = 'new name';
$debitur->debiturWife->address = 'new address';
$debitur->save();
0 голосов
/ 03 июля 2018

Вы могли бы сделать это так:

$debitur = new Debitur;
$debitur->name = $request->name;
$debitur->save();

$debitur->debiturWife()->create([
   'name' => $request->name,
   'address' => $request->address,
   'photo' => $request->photo
]);

Другой способ сделать это -

$debiturWife = new DebiturWife();
$debiturWife->name = $request->name;
$debiturWife->address = $request->address;
$debiturWife->photo = $request->photo;

$debitur->debiturWife()->save($debiturWife);

debitur_id будет установлено автоматически. Единственная разница между методом create & save заключается в том, что метод create принимает простой массив PHP, тогда как метод save принимает экземпляр DebitureWife

См. Документацию для лучшего понимания.

0 голосов
/ 03 июля 2018

Одним из способов является использование create:

$debitur = Debitur::create([
    'name' => $request->name
]);

$debiturWife = DebiturWife::create([
    'name' => $request->wife_name,
    'debitur_id' => $debitur->getKey()
]);

// chained together
Debitur::create([
    'name' => $request->name
])->debiturWife()->save(new DebiturWife([
    'name' => $request->wife_name
]));

При использовании массового присвоения в модели DebiturWife вам нужно будет включить debitur_id в массив $fillable:

protected $fillable = [
    'nama', 'address', 'photo', 'debitur_id'
];

Или с помощью построителя запросов:

$id = DB::table('debiturs')->insertGetId([
    'name' => $request->name
]);

DB::table('debitur_wifes')->insert([
    'name' => $request->wife_name,
    'debitur_id' => $id
]);

Обновление связанной модели:

Debitur::find($id)->debiturWife()->update(['name' => 'felicia']);
...