我正在尝试将我表单中的项目数组附加到联结表中。我已经使用foreach
循环给出了存储在表中的所有值。我将这一切都循环到我的选择列表中。
检索表格中的所有记录:
$resultRecipient = DB::table('users')->where('id', '!=', Auth::id())->get();
return view ('document.create')->with('resultRecipient', $resultRecipient);
形式:
<div class = "form-group">
<label for = "recipient_id" class = "control-label">To:</label>
<select name = "recipient_id[]" multiple class = "form-control" id = "myUserList">
@foreach ($resultRecipient as $list)
<option value = "{{ $list->id }}">{{ $list->username }}</option>
@endforeach
</select>
</div>
迁移:
用户
-id
-username
-password
文件
-id
-title
-content
-category_id - FK
recipients_documents (联结表)
-id
-senderUserId - FK对用户
的引用-recipientUserId - FK对用户
的引用-docu_id - FK参考文件
我的模特:
文档
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Document extends Model
{
public function recipients()
{
return $this->belongsToMany('Models\User');
}
}
用户:
<?php
namespace App\Models;
use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
class User extends Model implements AuthenticatableContract
{
use Authenticatable;
public function documents()
{
return $this->belongsToMany('Models\Document');
}
}
DocumentController:
public function postDocuments(Request $request)
{
$this->validate($request,
[
'title' => 'required|alpha_dash|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();
$document->recipients()->sync($request->recipient_id, false);
return redirect()->back();
}
当我尝试在recipient_id
的表单中附加请求时,但是错误说明了。我刚在app中创建了一个名为 Models
未找到类'模型\用户'
有人能说出我为什么会收到这个错误吗?任何帮助将不胜感激!
干杯
更新1
我按照@jaysingkar的步骤解决了这个错误。但是当我按下提交按钮后尝试sync
时,它会给我一个错误。
SQLSTATE [42S02]:找不到基表或视图:1146表'webdev.document_user'不存在(SQL:从
user_id
中选择document_user
document_id
= 15)
但它插入文档表但在我的juction表中不会插入我想要附加的内容。
更新2 感谢@jaysingkar和@ mydo47提供的帮助和提示。我已经创建了document_user表(联结)我添加了另一个外键,它重新发布到用户表。
截图:
正如您在此处所见,我在联结表中链接了两个外键。我想插入登录user_id
列的当前用户。我这里有一个表单,它循环访问我的数据库记录,但登录的当前用户的ID除外。
形式:
<div class = "form-group">
<label for = "recipient_id" class = "control-label">To:</label>
<select name = "recipient_id[]" multiple class = "form-control" id = "myUserList">
@foreach ($resultRecipient as $list)
<option value = "{{ $list->id }}">{{ $list->username }}</option>
@endforeach
</select>
联结表的迁移:
public function up()
{
Schema::create('document_user',function (Blueprint $table)
{
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->integer('recipientUserId')->unsigned();
$table->integer('document_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('recipientUserId')->references('id')->on('users')->onDelete('cascade');
$table->foreign('document_id')->references('id')->on('documents')->onDelete('cascade');
$table->dateTime('dateReceived')->default(DB::raw('CURRENT_TIMESTAMP'));
});
}
文件管理员:
public function postDocuments(Request $request)
{
$this->validate($request,
[
'title' => 'required|alpha_dash|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();
$document->recipients()->sync($request->recipient_id, false);
return redirect()->back();
}
但是当我尝试提交它时说。这是否有效,我可以将PK链接到两个FK?我可以在 document_user 表中插入所选列表,但如何插入当前用户?谢谢你的帮助
SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败(
webdev
。document_user
,CONSTRAINTdocument_user_recipientuserid_foreign
FOREIGN KEY({{ 1}})REFERENCESrecipientUserId
(users
)ON DELETE CASCADE)(SQL:插入id
(document_user
,document_id
)值(27,10) )
更新3
我已经摆脱了错误,因此我创建了一个user_id
此列,其中当前用户ID将插入名称unsignedInteger
迁移更新:
sender_id
我可以获取登录的当前用户的ID。但我在想如何根据用户的提交插入id。
DocumentController:
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'));
});
数据库截图:
答案 0 :(得分:2)
与@Marcin的答案一起,
你需要使用&#34; App \ Models \ User&#34;而不是&#34; Models \ User&#34;
public function recipients()
{
return $this->belongsToMany('App\Models\User');
}
找不到基表或视图:
您需要将document_user表存在于DB中才能使用多对多关系。该表格必须包含document_id
和user_id
列。
Laravel的文件解释了这个here
要定义此关系,需要三个数据库表:users, 角色和role_user。 role_user表派生自 相关模型名称的字母顺序,并包含 user_id和role_id列。
答案 1 :(得分:1)
在composer.json
中添加类图:
"classmap" : [
"database",
"app\Models"
]
config\auth.php
改变:
'model' => 'App\Models\User' ,
在User
模型中:
namespace App\Models;
<强>更新强>
使用document_user
FK创建新表document_id
到文档,并user_id
FK到users
。
修复功能收件人():
return $this->belongsToMany('App\Models\User', 'document_user', 'document_id', 'user_id');
修复功能文档():
return $this->belongsToMany('App\Models\Document', 'document_user', 'user_id', 'document_id');
答案 2 :(得分:0)
可能有很多原因,我假设你将User
模型移到Models
目录中,但你没有更改命名空间。
文件的开头应如下所示:
<?php
namespace App\Models;
class User
{
// ...