Php 拉雷维尔:拯救一段属于自己的关系

Php 拉雷维尔:拯救一段属于自己的关系,php,laravel,laravel-5,Php,Laravel,Laravel 5,我想在签名表中保存新签名。 每个签名可以链接到多个用户。 我在用户和签名之间有一个多对多表 我的签名是: class Signature extends Model { public $fillable = ['name', 'template']; public function users() { return $this->belongsToMany('App\User'); } } 我的控制器SigantureController.php是: p

我想在签名表中保存新签名。 每个签名可以链接到多个用户。 我在用户和签名之间有一个多对多表

我的签名是:

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

谢谢

您需要一个名为
user\u 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');
然后您的
用户
模型应具有以下方法:

型号用户

public function signatures() {
    return $this->belongsToMany('App\Signature');
}
现在您已经建立了模型之间的
多对多
关系,您可以做的是:

存储新记录(用于签名的控制器)时:

同样,在更新记录(用于签名的控制器)时:


首先,
associate
要求将模型对象作为参数传递。请看这里:

Is也用于
属于
关系,而不是像您这样的
多对多
。请看这里:

基于此,您应该做的是:

Signature::create($values)->users()->attach($user_id);

考虑到您的表是用户、签名和用户签名

在model: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 docs提供了更多细节和更好的示例。您应该检查attach()、detach()和sync()方法。请看一看:

非常感谢!碰巧我有一个名为user\u signature而不是signature\u user的关系表,所以这个命令给了我一个错误,因为目标表不存在。你知道我需要做什么吗?非常感谢,非常清楚的回答!但是,我需要在签名端进行存储;不在用户端。可能吗?怎么做?我已经编辑了答案,你可以看一下。非常感谢!碰巧我有一个名为user\u signature而不是signature\u user的关系表,所以这个命令给了我一个错误,因为目标表不存在。你知道我需要做什么吗?用适当的表名更改belongsTo方法中的第二个参数。这应该可以很好地理解。最后一行代码$user->signature()中有一个拼写错误,签名末尾没有“s”。
$user = User::find($user_id);
$signature = Signature::create($values)->users()->save($user);
$user = User::find($id);
$user->signature()->attach($signature->id);