Вставка Laravel по отношению к таблице составного ключа - PullRequest
0 голосов
/ 28 августа 2018

У меня есть следующие таблицы:

Таблица пользователей

id (primary key), name, email

Модель пользователя

protected $fillable = ['name', 'email'];
protected $visible = ['id','name','email'];
//Relationship
public function customAttributes()
{
    return $this->hasMany('App\Models\UserAttribute');
}

Таблица атрибутов пользователя

user_id, attribute_id, value //user_id and attribute_id is a composite key, both foreignkeys acting as primary keys establishing an unique combination

Модель атрибута пользователя

protected $fillable = ['user_id', 'attribute_id','value'];
protected $visible = ['user_id', 'attribute_id','value'];

Я буду использовать следующий пример для объяснения проблемы:

$user = $this->user->create(['name' => 'admin', 'email' => 'admin@admin.com']);
//This works
$user->customAttributes()->save(new \App\Models\UserAttribute(['user_id' => $user->id, 'attribute_id' => 1, 'value' => 'Just a custom1']));
//This does not work 
$user->customAttributes()->create([new \App\Models\UserAttribute(['user_id' => $user->id, 'attribute_id' => 1, 'value' => 'Just a custom1'])]);

Я мог бы просто повторить save для каждого обычая, который мне нужен, поскольку он работает, но я пытаюсь выяснить, почему create не работает.

Ошибка, которую я получаю, когда использую команду create (да, я проверил, существует ли запись в таблице, которой нет в списке):

Cannot add or update a child row: a foreign key constraint fails (`testdatabase`.`user_attributes`, 
CONSTRAINT `user_attributes_attribute_id_foreign` FOREIGN KEY (`attribute_id`) REFERENCES `attributes` (`id`))

Это запрос, который он пытается выполнить:

insert into `user_attributes` (`user_id`) values (1)

Мне просто любопытно, почему это не работает с create, я не уверен, связано ли это с этим конкретным сценарием (создать таблицу составного ключа по взаимосвязи). Это несколько игнорирует поля value и attribute_id в запросе, который выполняет

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

customAttributes() уже возвращает вам экземпляр модели UserAttribute, вам не нужно вводить эту зависимость, когда вы используете метод create() через это отношение

Ваш запрос должен быть как ниже;

$user->customAttributes()->insert([
   [
   'user_id' => $user->id,
   'attribute_id' => 1,
   'value' => 'Just a custom1'
   ],
   [
   'user_id' => $user->id,
   'attribute_id' => 2,
   'value' => 'Just a custom2'
   ],
]);
0 голосов
/ 28 августа 2018

попробуйте это:

$user->customAttributes()->create(['user_id' => $user->id, 'attribute_id' => 1, 'value' => 'Just a custom1']);
...