我还在想有没有办法创建一个自定义的透视表名称?因为我创建了一个文档和用户表与document_user有多对多关系,后者是我的数据透视表,并且该表是为用户创建的已接收文档创建的。我计划为文档和用户创建另一个数据透视表,该表用于发送的文档,这样我就可以拥有历史记录。请参阅下面的代码。
create_document_user_table
public function up()
{
Schema::create('document_user',function (Blueprint $table)
{
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->integer('document_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('document_id')->references('id')->on('documents')->onDelete('cascade');
$table->unsignedInteger('sender_id')->nullable();
$table->foreign('sender_id')->references('id')->on('users')->onDelete('cascade');
$table->dateTime('dateReceived')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('dateModified')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
});
}
文档表
public function up()
{
Schema::create('documents', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('content');
$table->integer('category_id')->unsigned();
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
$table->timestamps();
});
}
用户表
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('first_name');
$table->string('last_name');
$table->string('middle_name');
$table->string('email');
$table->string('username');
$table->string('address');
$table->string('password');
$table->string('remember_token');
$table->integer('role_permission_id')->unsigned();
$table->foreign('role_permission_id')->references('id')->on('roles_permissions_dt')->onDelete('cascade');
$table->timestamps();
});
}
这可以很好地将记录插入到我的数据透视表中。我计划实现的是,每当我为文档插入记录时,它也会插入到我的自定义数据透视表中,而不仅仅是插入到document_user数据透视表。任何帮助都将不胜感激!感谢您的信息或提示。
更新
@米娜,谢谢你给我的提示,但实际上这是我为我的透视表插入或保存的。如何将其插入修订表?
文档控制器
public function postDocuments(Request $request)
{
$this->validate($request,
[
'title' => 'required|regex:/(^[A-Za-z0-9 ]+$)+/|max:255',
'content' => 'required',
'category_id' => 'required',
'recipient_id' => 'required',
]);
$document = new Document();
//Request in the form
$document->title = $request->title;
$document->content = $request->content;
$document->category_id = $request->category_id;
$document->save();
$user = Auth::user();
foreach($request->recipient_id as $recipientId)
{
$document->recipients()->sync([ $recipientId => ['sender_id' => $user->id]],false );
}
return redirect()->back();
}
您可以随心所欲地调用数据透视表。
如前所述,要确定关系的连接表,Eloquent将加入两个相关的模型按字母顺序排列的名字。但是,您可以自由覆盖习俗您可以通过将第二个参数传递给belongsToMany方法:
return $this->belongsToMany('App'Role', 'user_roles');
(Eloquet:关系#多对多)
在你的情况下,你需要定义这样的关系:
class User extends Model
{
// other stuff
createdDocuments()
{
return $this->belongsToMany('App'Document', 'document_user_created');
}
sentDocuments() // or receivedDocuments()
{
return $this->belongsToMany('App'Document', 'document_user_sent');
}
// other stuff
}
class Document extends Model
{
// other stuff
createdByUsers()
{
return $this->belongsToMany('App'User', 'document_user_created');
}
sentToUsers() // or sentFromUsers() or whatever it does mean
{
return $this->belongsToMany('App'User', 'document_user_sent');
}
// other stuff
}
您不需要另一个透视表。你需要一张这样的桌子:
public function up()
{
Schema::create('revisions', function (Blueprint $table) {
$table->increments('id');
$table->integer('document_id')->unsigned();
//Rest of table structure
$table->foreign('document_id')->references('id')->on('document_user')->onDelete('cascade');
$table->timestamps();
});
}
当你需要创建一个新的修订版:
$document = new Document;
//add $document attributes
$user->documents()->save($document);
$document->recipients->each(function($recipient){
$id = $recipient->pivot->id;
Revision::create(['document_id'=>$id]);
})