Laravel: сохранение отношения toMany
Я хочу сохранить новую подпись в моей табличной подписи.
Каждая подпись может быть связана с несколькими пользователями.
У меня есть много разных таблиц между пользователями и подписями.
Подпись моей модели:
class Signature extends Model {
public $fillable = ['name', 'template'];
public function users() {
return $this->belongsToMany('App\User');
}
}
Мой контроллер SigantureController.php:
public function store(CreateSignaturesRequest $request)
{
//return $user_id;
$values = $request->only(['name','template']);
Signature::create($values));
return response()->json(['message'=>'SUCCESS'], 201);
}
Как сделать, чтобы создать мою подпись и связать ее с пользователем?
Я пробовал
Signature::create($values)->associate($user_id);
Спасибо
Ответы
Ответ 1
Учитывая, что вашими таблицами являются пользователи, подписи и user_signatures
Определите отношение в модели: User.php
class User extends Model {
public function signatures() {
return $this->belongsToMany('\App\Signature', 'user_signatures');
}
}
Определите обратное отношение в модели: Signature.php
class Signature extends Model {
public function users() {
return $this->belongsToMany('\App\User', 'user_signatures');
}
}
В вашем контроллере вы можете сделать следующее:
//create a new signature
$signature = new Signature($values);
//save the new signature and attach it to the user
$user = User::find($id)->signatures()->save($signature);
Возможно также и обратное:
$user = User::find($user_id);
$signature = Signature::create($values)->users()->save($user);
Альтернативно, если у вас есть существующая подпись, вы должны сделать:
$user = User::find($id);
$user->signature()->attach($signature->id);
Обратите внимание, что attach() и detach() принимают идентификатор или массив идентификаторов.
Laravel docs охватил это гораздо более подробными и лучшими примерами. Вы должны проверить методы attach(), detach() и sync(). Пожалуйста, посмотрите: http://laravel.com/docs/5.0/eloquent#inserting-related-models
Ответ 2
Вам нужно иметь таблицу с именем user_signature
со следующей схемой:
$table->integer('user_id')->unsigned();
$table->integer('signature_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('signature_id')->references('signatures')->on('users');
Затем ваша модель User
должна иметь следующий метод:
Model User
public function signatures() {
return $this->belongsToMany('App\Signature');
}
Теперь, когда вы разработали связь Many-To-Many
между моделями, что вы можете сделать, это следующее:
При сохранении новой записи (контроллер, который вы используете для подписи):
/**
* Insert the signature
*
* @param Request $request
* @return ...
*/
public function store( Request $request ) {
// your validation
$signature->users()->attach( $request->input('user_id') );
// return
}
Аналогично, обновляя запись (контроллер, который вы используете для подписи):
/**
* Update the signature with the particular id
*
* @param $id
* @param Request $request
* @return ...
*/
public function update( $id, Request $request ) {
// your validation
$signature->users()->sync( $request->input('user_id') );
// return
}
Ответ 3
Прежде всего associate
требует передачи объекта модели в качестве аргументов. См. Здесь: http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Relations/BelongsTo.html#method_associate
Is также для отношений belongsTo
, а не Many to Many
, как в вашем случае. См. Здесь: http://laravel.com/docs/5.0/eloquent#inserting-related-models
Основываясь на этом, вы должны:
Signature::create($values)->users()->attach($user_id);