【问题标题】:How to insert to pivot table如何插入数据透视表
【发布时间】:2016-12-12 14:26:56
【问题描述】:

我正在尝试使用 Laravel 5.3 和 mysql 跟踪半私人网球课程记录。我正在尝试遵循 Laravel 5 多对多教程中设置的示例。我有一个 Players 模型,我试图通过 Player_Sharedlessonhours 数据透视表与 Sharedlessonhours 表同步。在代码中,我的 sharedlessonhours 表获得了插入的记录,但数据透视表没有。抱歉这么冗长,但我想弄清楚发生了什么。

首先是表结构。

     public function up()
{
    Schema::create('sharedlessonhours', function (Blueprint $table) {
        $table->increments('id');
        $table->date('signup_date');
        $table->integer('packages_id')->unsigned();
        $table->timestamps();


    });

     Schema::table('sharedlessonhours', function (Blueprint $table) {
         $table->foreign('packages_id')->references('id')->on('packages');
     });


    Schema::create('player_sharedlessonhour', function (Blueprint $table) 
    {
        $table->integer('sharedlessonhours_id')->unsigned();
        $table->integer('players_id')->unsigned();
        $table->timestamps();


    });

    Schema::table('player_sharedlessonhour', function (Blueprint $table) {
        $table->foreign('sharedlessonhours_id')->references('id')->on('sharedlessonhours')->onDelete('cascade');
          $table->foreign('players_id')->references('id')->on('players')->onDelete('cascade');

     });
}

创建和存储方法:

    public function createSharedLessonhours()
{
    $players = Players::orderBy('lname')->pluck('fname', 'id');
    $packages = Packages::orderBy('name')->pluck('name','id');
    return view('admin.lessonhours.sharedlessonhours', compact('players', 'packages'));
}

public function storeSharedLessonhours(Request $request)
{
   $sharedlessonhours = SharedLessonhours::create($request->all());

   $sharedlessonhours->players()->attach($request->input('players'));
}

形式:

        <div class="col-md-4 col-sm-5">
    {!! Form::open(['url' => 'sharedlessonhours']) !!}
    <div class="form-group">
        {!! Form::label('players', 'Player(s):') !!}
        {!! Form::select('players[]', $players, null, ['class' => 'form-control', 'multiple']) !!}
    </div>
    <div class="form-group">
        {!! Form::label('signup_date', 'Signup Date:') !!}
        {!! Form::text('signup_date', null, ['class' => 'form-control']) !!}
    </div>
    <div class="form-group">
        {!! Form::label('packages_id', 'Lesson Package:') !!}
        {!! Form::select('packages_id', $packages, null, ['class' => 'form-control', 'placeholder' => 'Choose Package']) !!}
    </div>

    <div class="form-group">
        {!! Form::submit('Signup', ['class' => 'btn btn-default form-control']) !!}
    </div>

{!! Form::close() !!}
</div>

玩家ID选择框截图:

以及错误截图:

我想知道数组是否只是顺序不正确? dd($request) 显示正在从表单中收集所有内容,但查看错误页面似乎正在尝试将数据插入错误的字段。如果这对 mysql 很重​​要,那么具有 (3,4) 的行将不是正确的顺序。我尝试翻转mysql中的列,但没有帮助。 我现在很困惑。

更新: 首先,我将分享请求的代码,然后分享我为调试所采取的进一步步骤。

播放器型号代码:

namespace App;

use Illuminate\Database\Eloquent\Model;
use Collective\Html\Eloquent\FormAccessible;
use Carbon\Carbon;


class Players extends Model
{
    public $table = "players";

    protected $fillable = array('fname', 'lname', 'gender', 'birthdate');


    public function users()
    {
        return $this->belongsTo('App\User', 'users_id');
    }

    public function lessonHours()
    {
        return $this->hasMany('App\Lessonhours', 'players_id');
    }

    public function sharedlessonhours()
    {
             return $this->belongsToMany('App\SharedLessonhours',            "player_sharedlessonhour","players_id", "sharedlessonhours_id" );
    }

    public function getFullName($id)
    {
        return ucfirst($this->fname ) . ' ' . ucfirst($this->lname);
    }

    protected $dates = ['birthdate'];

    public function setBirthdateAttribute($value)
    {
        $this->attributes['birthdate'] = Carbon::createFromFormat('m/d/Y',     $value);
    }
}

共享课时:

    <?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Collective\Html\Eloquent\FormAccessible;
use Carbon\Carbon;

class SharedLessonhours extends Model
{
    use FormAccessible;

    protected $fillable = array('signup_date', 'packages_id');

    public $table = "sharedlessonhours";

    public function players()
    {
        return $this->belongsToMany('App\Players',     "player_sharedlessonhour", "players_id", "sharedlessonhours_id");
    }

    public function sharedhoursused()
    {
        return $this->hasMany('App\SharedHoursused', 'id');
    }

    public function packages()
    {
        return $this->belongsTo('App\Packages');
    }

    public function setSignUpDateAttribute($value)
    {
        $this->attributes['signup_date'] = Carbon::createFromFormat('m/d/Y',     $value);
    }
}

我在更改 mysql 中的列后尝试添加不同的记录并再次收到错误。我将列切换回来并且错误继续存在,即使在重新启动修补程序之后也是如此。

【问题讨论】:

  • 您能否尝试对播放器 ID 进行硬编码以进行调试(在附加调用中)。我无法从提供的代码中发现任何问题。
  • 你没有提供 SharedLessonhours 类,特别是 player() 方法,可能问题出在那儿
  • 你能把Player模型的内容和SharedLessonhours模型中的关系签名贴出来吗?
  • 我很抱歉,但我正在努力更新我的问题,因为当我粘贴代码时编辑器不断抛出错误的格式错误。
  • 试图更新帖子真是太疯狂了。我不得不使用空格键手动缩进,保存,然后重复。最后,我希望这个更新对每个人都有意义。

标签: mysql laravel laravel-5.3


【解决方案1】:

除了自定义连接表的名称外,您还可以通过将附加参数传递给 belongsToMany 方法来自定义表上键的列名。第三个参数是要定义关系的模型的外键名称,而第四个参数是要加入的模型的外键名称

来自多对多关系的 laravel 文档。

因此,players 模型中 SharedLessonhour 关系的定义应为

public function players()
{
    return $this->belongsToMany('App\Players',  "player_sharedlessonhour", "sharedlessonhours_id",  "players_id");
}  

尝试更改定义并查看。我还没有测试过,但这似乎是违反约束的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 2020-09-19
    • 1970-01-01
    • 2021-11-15
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多