使用很多很多关系Laravel 5.2,Sync方法将无法工作

时间:2016-07-22 04:33:18

标签: php laravel eloquent synchronization laravel-5.2

我正在尝试将我表单中的项目数组附加到联结表中。我已经使用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表(联结)我添加了另一个外键,它重新发布到用户表。

截图:

Many to many

正如您在此处所见,我在联结表中链接了两个外键。我想插入登录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无法添加或更新子行:外键约束失败(webdevdocument_user,CONSTRAINT document_user_recipientuserid_foreign FOREIGN KEY({{ 1}})REFERENCES recipientUserIdusers)ON DELETE CASCADE)(SQL:插入iddocument_userdocument_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'));
    });

数据库截图:

enter image description here

3 个答案:

答案 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_iduser_id列。

Laravel的文件解释了这个here

  

要定义此关系,需要三个数据库表:users,   角色和role_user。 role_user表派生自   相关模型名称的字母顺序,并包含   user_id和role_id列。

答案 1 :(得分:1)

  1. composer.json中添加类图:

    "classmap" : [ "database", "app\Models" ]

  2. config\auth.php改变:

    'model' => 'App\Models\User' ,

  3. User模型中:

    namespace App\Models;

  4. 更新作曲家
  5. <强>更新 使用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
{
  // ...