2016-05-15 5 views
1

У меня есть таблица «users» и таблица «activation_tokens». У меня есть отношение в модели User как hasOne (ActivationToken :: class);Laravel mass-assign insert new record create() альтернатива?

Это все работает нормально. Теперь я хочу создать токен при создании пользователя. Поэтому я звоню

$user->ActivationToken()->create(array('token'=>'RANDOM_STRING")); 

Это все хорошо, но я попал в ошибку массового присвоения. I не хотите установить «токен» как заполняемый.

Вместо этого я стараюсь

$activationToken = new ActivationToken(); 
    $activationToken->token = 'RANDOM_STRING"; 
    $activationToken->save(); 

Что это хорошо, но она не устанавливает user_id поле в запросе. Думаю, я мог бы сделать это вручную, установив $activationToken->user_id = $user->id;. Но это кажется неправильным, так как ORM должен обрабатывать это автоматически, насколько это возможно для рекламы. Так что я думаю, что я делаю что-то неправильно?

Я не мог понять, как это сделать правильно. Любые намеки?

Спасибо!

+0

Если вы хотите перейти в _ORM way_, вам нужно установить токен в массив 'fillable' для массового присвоения. В противном случае вам нужно установить его вручную с помощью нестандартного метода '$ activationToken-> user_id = $ user-> id'. Два пути вы можете пойти. Почему вы не хотите устанавливать поле 'fillable'? – codedge

+0

Если мне нужно установить все заполняемое, чтобы иметь возможность использовать путь ORM, разве это не побеждает цель заполняемого/охраняемого?Разве это цельное массовое задание является ошибочной концепцией? Кто бы все равно присвоил все значения из случайного запроса HTTP в запрос базы данных. :) Не было бы проще просто сделать функцию в классе ActivationToken, которая принимает аргумент user_id и вставляет токен? Тогда я мог бы просто вызвать ActivationToken :: inserToken ($ user-> id) и сделать с ним. –

+0

@codedge, пожалуйста, см. Ответ, который я разместил. Кажется, есть способ обновить таблицу с помощью массового присвоения без добавления столбцов для заполнения. –

ответ

0

Итак, после обыска в Интернете я узнал, что временно могу остановить ограничения массового назначения.

ActivationToken::unguard(); 
    $user->ActivationToken()->create(array('token'=>str_random(100))); 
    ActivationToken::reguard(); 

Это похоже на работу. Также ответ jsphpl был довольно приятным, и решение ниже работает отлично.

Конечно, остаются некоторые вопросы.

1- Почему

$activationToken->user()->associate($user); 

лучше

$activationToken->user_id = $user->id; 

2- Когда unguard линия выполнена:

ActivationToken::unguard(); 

Есть ли способ, что таблица может быть злоупотребляли до того reguard() вызывается другим процессом PHP? Примечание: Я предполагаю, что это влияет на запущенный процесс только так в моем случае это должно быть безопасно, возможно ...

Во всяком случае, они выходят за рамки первоначального вопроса так ...

Спасибо за все ответы!

1

Может быть немного больше ОРМ-иш:

... 
$activationToken->user()->associate($user); 
$activationToken->save(); 

$activationToken->user() это имя отношения, указывающие на модели пользователя. Обратите внимание на ()!

+0

У меня есть отношение пользователя() с attribTo в ActivationToken model Однако я думаю, что attach() не работает с hasOne() и принадлежит Too(), возможно? Я получаю сообщение об ошибке: «Вызовите неопределенный метод Illuminate \ Database \ Query \ Builder :: attach()», и моя IDE говорит «Метод« attach »не найден в \ Illuminate \ Database \ Eloquent \ Relations \ BelongsTo" –

+0

Вы правы , должен быть 'associate ($ user)' then, а не 'attach'. Можете ли вы попробовать это? – jsphpl

+0

Да, ассоциируется. Но я не совсем понимаю, что было бы преимуществом по сравнению с $ activationToken-> user_id = $ user-> id; ? Между тем, я нашел лучшее решение, я думаю. Я обновлю свой пост. –