我想在我的表签名中保存一个新签名。 每个签名都可以链接到多个用户。 我在用户和签名之间有多对多的表。
我的模特签名是:
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);
由于
答案 0 :(得分:25)
考虑您的表是用户,签名和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()接受id或id数组。
Laravel文档已经在更多细节和更好的例子中介绍了这一点。你应该检查attach(),detach()和sync()方法。请看一下:http://laravel.com/docs/5.0/eloquent#inserting-related-models
答案 1 :(得分:6)
您需要有一个名为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
}
答案 2 :(得分:2)
首先,associate
需要将模型对象作为参数传递。见这里:http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Relations/BelongsTo.html#method_associate
也适用于belongsTo
关系,而不是Many to Many
,就像你的情况一样。见这里:http://laravel.com/docs/5.0/eloquent#inserting-related-models
根据你应该做的是:
Signature::create($values)->users()->attach($user_id);