Laravel - Eloquent attach() 不适用于模型
Laravel - Eloquent attach() not working for models
TL;DR
尝试让三个模型进行交互使用 eloquent 休息一下 api。
- 用户 - belongsToMany(拉)
- 拉 - belongsToMany(user) && belongsToMany(boxes)
- Box - belongsToMany(拉)
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');
}
}
TL;DR
尝试让三个模型进行交互使用 eloquent 休息一下 api。
- 用户 - belongsToMany(拉)
- 拉 - belongsToMany(user) && belongsToMany(boxes)
- Box - belongsToMany(拉)
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');
}
}