Laravel не может сохранить полиморфные отношения - PullRequest
0 голосов
/ 07 октября 2018

Я хочу иметь полиморфную связь между сервисами и различными типами сервисных данных (в данном примере это typo3_data).

У меня есть следующая модель данных:

projects
--------
id
name

services
--------
id
type
project_id
data_type
data_id

typo3_data
--------
id
url

Проектыи сервисы имеют простое отношение OneToMany.Но модель сервиса нуждается в полиморфном отношении, потому что существуют разные виды сервисов, которым нужны разные столбцы в соответствующей таблице.

Моя модель сервиса выглядит следующим образом:

class Service extends Model
{
    public function project()
    {
        return $this->belongsTo(Project::class);
    }

    public function data()
    {
        return $this->morphTo('data');
    }
}

Модель TYPO3Data выглядитнапример:

class TYPO3Data extends Model
{
    protected $table = 'typo3_data';

    public function service()
    {
        return $this->morphOne(Service::class, 'data');
    }
}

В настоящее время я пытаюсь сохранить данные в службе следующим образом (упрощенно):

public function store(Project $project)
{
    $service = new Service(['type' => 'TYPO3']);
    $service->data()->save(new TYPO3Data(['url' => 'http://example.com']));
    $project->services()->save($service);
}

Но теперь я получаю сообщение об ошибке с ограничением NOT NULL для служб.data_type.

Кто-нибудь знает, как решить эту часть, чтобы я мог сохранить полиморфное отношение?

Заранее спасибо

1 Ответ

0 голосов
/ 07 октября 2018

save() предназначен для HasMany отношений.Вместо этого используйте associate():

$data = TYPO3Data::create(['url' => 'http://example.com']);
$service = new Service(['type' => 'TYPO3']);
$service->data()->associate($data);
$project->services()->save($service);

Также обратите внимание на полиморфные отношения «многие ко многим» .

...