HasOne создать не обновляющее чужое поле - PullRequest
2 голосов
/ 21 июня 2019

Я использую Laravel и пытаюсь создать связанную запись из массива, используя метод HasOne :: create. Он вставляет связанную запись, но не добавляет новый идентификатор во внешнее поле основной модели. Что я делаю не так?

Thx

    $contact = new Contact();

    $contact->company = $data['company'] ?? '';
    $contact->comment = $data['comment'] ?? '';

    $contact->save();

    $contact->address()->create($data['address']);

    ...

    var_dump($contact->address_id); exit();

Отношения работают нормально, все поля указаны. Методы -> get () возвращают правильные модели

Результат var_dump - null

Кроме того, $ data ['address'] содержит действительные данные, указанные как заполняемые в модели адреса, а address_id заполняемый для модели контакта

UPD:

Контактный класс:

public function address()
{
    return $this->hasOne(Address::class, 'id', 'address_id');
}

Адрес класса:

    public function contact()
{
    return $this->belongsTo(Contact::class, 'id', 'address_id');
}

$ data ['address'] содержит массив с ['raw' => 'someaddress'], необработанное поле в $ fillable

1 Ответ

1 голос
/ 21 июня 2019

Есть хорошее руководство по Eloquent Relationships здесь .

Исходя из этого, я только что проверил приведенный ниже код, и он отлично работает (используя Laravel 5.8)

Миграция

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class Cars extends Migration
{

    public function up()
    {
        Schema::create('owners', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });

        Schema::create('cars', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();

            $table->integer('owner_id')->unsigned()->index()->nullable();
            $table->foreign('owner_id')->references('id')->on('owners');
        });
    }

    public function down()
    {
        Schema::drop('cars');
        Schema::drop('owners');
    }
}

Модели

//App/Owner.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Owner extends Model
{
    protected $fillable = ['name'];

    public function car()
    {
        return $this->hasOne(Car::class);
    }

}

//App/Car.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Car extends Model
{
    protected $fillable = ['name'];

    public function owner()
    {
        return $this->belongsTo(Owner::class);
    }
}

Тест

<?php

namespace Tests\Feature;

use App\Owner;
use Tests\TestCase;

class TestCars extends TestCase
{
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function testExample()
    {
        $owner = new Owner(['name' => 'Jack']);
        $owner->save();

        $owner->car()->create(['name' => 'Nice Car']);
    }
}

SQL

select * from cars;
------------
# id, name, created_at, updated_at, owner_id
'1', 'Nice Car', '2019-06-21 13:08:58', '2019-06-21 13:08:58', '1'

select * from owners
-------------
# id, name, created_at, updated_at
'1', 'Jack', '2019-06-21 13:08:58', '2019-06-21 13:08:58'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...