Laravel : 拯救一个属于多才多艺的关系

2022-08-30 17:32:20

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

我的模特签名是:

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

在模型中定义关系:用户.php

class User extends Model {
   public function signatures() {
       return $this->belongsToMany('\App\Signature', 'user_signatures');
   }
}

在模型中定义关系的反函数:签名.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


答案 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
}

推荐