Laravel - Eloquent attach() 不适用于模型

Laravel - Eloquent attach() not working for models

TL;DR


尝试让三个模型进行交互使用 eloquent 休息一下 api。

pull_user table 运行良好,我可以在保存拉取后附加用户。保存一个盒子工作正常,但附件不会 work/enter 任何东西进入枢轴 table (虽然我没有收到错误)。

问题


我无法在保存后获得将我的两个模型关联到 attach() 的枢轴 table。我有上面列出的三个模型,枢轴适用于 pull_user 但不适用于 pull_box,即使 save for box 工作正常。我能够在没有错误的情况下保存一个框,但关联从未发生(没有错误)。

代码


pull_box.php

class PullBox extends Migration
{

  public function up()
  {
    Schema::create('pull_box', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->integer('pull_id');
        $table->integer('box_id');

    });
  }

  public function down()
  {
    Schema::dropIfExists('pull_box');
  }
}

Pull.php

class Pull extends Model
{
    protected $fillable = ['from', 'to', 'runit_id', 'start_time', 'end_time', 'box_count', 'pull_status', 'audit_status', 'status', 'total_quantity', 'accuracy'];

    public function users(){
        return $this->belongsToMany('App\User');
    }
    public function boxes(){
        return $this->belongsToMany('App\Box');
    }
}

Box.php

class Box extends Model
{
    protected $fillable = ['user_id','from', 'to', 'runit_id', 'start_time', 'end_time', 'pull_id', 'total_quantity', 'status', 'accuracy'];

    public function pulls(){
        return $this->belongsToMany('App\Pull');
    }
}

BoxController.php

public function store(Request $request)
{
    $this->validate($request, [
        'user_id' => 'required|integer',
        ...
    ]);

    $user_id = $request->input('user_id');
    ...

    $box = new Box([
        'user_id' => $user_id,
        ...
    ]);

    $pull = Pull::whereId($pull_id)->first();

    if($box->save()){
        $pull->boxes()->attach($box->id);
        $box->view_box = [
            'href' => 'api/v1/box/' . $box->id,
            'method' => 'GET'
        ];
        $message = [
            'msg' => 'Box created',
            'box' => $box,
            'pull' => $pull_id
        ];

        return response()->json($message, 201);
    }

    $response = [
        'msg' => 'Box creation error, contact supervisor',
    ];
    return response()->json($response, 404);
}

解决方案


我需要知道如何让这个协会发挥作用。我将需要在 Item 的拉动下添加一个新层,但我不想在解决此问题之前移动一个层。我认为我的问题必须源于我的 syntactical/logical 错误,但我看不到它。 SO上有一堆问题非常接近于给我一个解决方案,但是在阅读之后我无法解决我的问题。

感谢任何帮助。

尝试将您的 pull_box table 重命名为 box_pull,laravel 上的枢轴 table 必须按字母顺序排列。如果你想在 pivot table 上使用自定义名称,你必须扩展你的 pivot,例如:

<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class PullBox extends Pivot
{
    protected $table = 'pull_box';
}

还有你的多对多关系:

class Pull extends Model
{
    protected $fillable = ['from', 'to', 'runit_id', 'start_time', 'end_time', 'box_count', 'pull_status', 'audit_status', 'status', 'total_quantity', 'accuracy'];

    public function users(){
        return $this->belongsToMany('App\User');
    }
    public function boxes(){
        return $this->belongsToMany('App\Box')->using('App\PullBox');
    }
}

class Box extends Model
{
    protected $fillable = ['user_id','from', 'to', 'runit_id', 'start_time', 'end_time', 'pull_id', 'total_quantity', 'status', 'accuracy'];

    public function pulls(){
        return $this->belongsToMany('App\Pull')->using('App\PullBox');
    }
}