Подтвердить что ты не робот

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);

Спасибо

4b9b3361

Ответ 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);