【问题标题】:Laravel - Create and Attach - Many to Many relationshipLaravel - 创建和附加 - 多对多关系
【发布时间】:2017-03-02 06:35:22
【问题描述】:

我需要一些帮助。

我有这些表:用户、购买和编解码器。我有一个多对多的关系:购买、编解码器、buy_codec

表格

Schema::create('codecs', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->timestamps();
});

Schema::create('buys', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->string('name');
});   

Schema::create('buy_codec', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('buy_id')->unsigned();
    $table->foreign('buy_id')->references('id')->on('buys')->onDelete('cascade');

    $table->integer('codec_id')->unsigned();
    $table->foreign('codec_id')->references('id')->on('codecs')->onDelete('cascade');

    $table->timestamps();
});    

模型

class Codec extends Model
{
    protected $guarded = ['id'];
    public function buy() {
        return $this->belongsToMany('App\Buy');
    }
}

class Buy extends Model
{
    protected $guarded = ['id'];
    public function codec() {
        return $this->belongsToMany('App\Codec');
    }
}

class User extends Authenticatable
{
    public function buy() {
        return $this->hasMany('App\Buy');
    }
}

我想用 user_id 填充 buy 表,并附加 codecs 表中的编解码器。

这是购买创建表单。

{!! Form::open(['method'=>'POST', 'action'=>['UserBuyController@store', $usr->id]]) !!}

    <div class="form-group">
        {!! Form::label('name', 'Name:') !!}
        <div class="input-group">
            <span class="input-group-addon"><i class="fa fa-font"></i></span>
            {!! Form::text('name', null, ['class'=>'form-control']) !!}
        </div>
    </div>

    <div class="form-group">
        {!! Form::label('codecs', 'Outbound Codecs:') !!}
        <div class="input-group">
            <span class="input-group-addon"><i class="fa fa-language"></i></span>
            {!! Form::select('codecs[]', $codecs, null, ['class'=>'form-control', 'multiple'=>true]) !!}
        </div>
    </div>

    {!! Form::submit('Submit', ['class'=>'btn btn-info']) !!}

{!! Form::close() !!}

如果我不附加编解码器,一切正常。

用户购买控制器

class UserBuyController extends Controller
{
    public function create($userId)
    {
        $codecs = Codec::lists('name', 'id');
        $usr = User::findOrFail($userId);
        return view('buy.create', compact('usr', 'codecs'));
    }

    public function store($userId, Request $request)
    {
        $usr = User::findOrFail($userId)->buy()->create($request->all());
        return view('buy.index');
    }
}

如何创建购买记录(因为我需要购买 ID),然后将编解码器附加到数据透视表中?

谢谢!

【问题讨论】:

    标签: laravel laravel-5 eloquent laravel-5.2 many-to-many


    【解决方案1】:

    在模型中,你不得不提到中间表。

    class Codec extends Model
    {
        protected $guarded = ['id'];
        public function buy() {
            return $this->belongsToMany('App\Buy', 'buy_codec', 'codec_id', 'buy_id');
        }
    }
    

    class Buy extends Model
    {
        protected $guarded = ['id'];
        public function codec() {
            return $this->belongsToMany('App\Codec', 'buy_codec', 'buy_id', 'codec_id');
        }
    }
    

    然后在控制器中,

    public function store($userId, Request $request)
    {
            $buy = User::findOrFail($userId)->buy()->create($request->all());
            $buy->codec()->attach([codec_ids]);
            return view('buy.index');
    }
    

    您可以使用 attach 方法附加更多编解码器对象或 id。

    请参考此链接

    https://laravel.com/docs/5.2/eloquent-relationships#inserting-related-models

    【讨论】:

    • 我现在如何进行模型绑定?
    • 如果命名约定符合规则,则无需提及中间表
    【解决方案2】:

    有几种方法可以实现这一目标。您可以attach()sync()。我总是使用attach() 函数存储数据透视数据。

    $usr = User::findOrFail($userId)->create($request->all());
    $usr->buy()->attach($request->codecs);
    

    或者,您可以内联查询:

    $usr = User::findOrFail($userId)->create($request->all())->buy()->attach($request->codecs);
    

    【讨论】:

      【解决方案3】:

      您可以附加()或同步()。我总是使用 attach() 函数存储数据透视数据。

          $buy = Buy::findOrFail($id);
          $buyId = $request->input('codec');
          $buy->codec()->attach($buyId);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-06
        • 1970-01-01
        • 2016-03-14
        • 2011-07-07
        • 1970-01-01
        • 2013-09-05
        相关资源
        最近更新 更多