在laravel中按ID更新数据透视表

时间:2014-11-01 18:27:09

标签: laravel pivot-table updatemodel

bookmaker table
id
name


bookmaker_user table
id 
account_name
bookmaker_id
user_id


user table
id
name

User Model :
public function bookmakers(){
    return $this->belongsToMany('Bookmaker', 'bookmaker_user', 'user_id', 'bookmaker_id')
            ->withPivot('id', 'accountname')->withTimestamps();
}


BookmakerController.php
public function update($id)
{
            $bookname = Input::get('booknamemodifselect');
            $accountname = Input::get('accountnamemodifinput');
            $bankrollinvested = Input::get('bankrollinvestedmodifinput');
            $bonus = Input::get('bonusmodifinput');
            $bankrollamount = Input::get('bankrollamountmodifinput');

            $bookmodif = DB::table('bookmakers')->where('name', $bookname)->first();


            $bookmaker = $this->user->bookmakers()->where('bookmaker_user.id','=',$id)->first();
            $bookmaker->pivot->bookmaker_id = $bookmodif->id;
            $bookmaker->pivot->save();
    }

$ id是帐户的ID

$ this-> user是用户身份验证。

我想根据用户身份验证的ID(我的意思是帐户ID)更新帐户的博彩公司。因为用户auth具有多个具有相同博彩公司但具有不同帐户名称的条目。 它说'试图获得非对象的财产'。

2 个答案:

答案 0 :(得分:3)

总结问题下面的评论,它不是一个非常常见的数据库设计。这也意味着改变它可能是一个好主意。通过将bookmaker_user数据透视表转换为具有自己的模型类的完整增长表。原因是:

  • 属于同一用户和博彩公司的多个记录(多对多应该只有一个)
  • 存储在数据透视表中的其他数据(虽然通常没问题,但它会添加到第一点)
  • 更轻松地处理更改(例如更改帐户的博彩公司)

但这不是问题所带来的问题,所以这就是:

我在本地尝试过,但我没有收到任何错误,但我不会保存到数据库中。
这似乎是某种错误或意外行为。但是,解决方法是使用查询生成器 在我看来,这个案子更优雅......

$bookmodif = DB::table('bookmakers')->where('name', $bookname)->first();

if($bookmodif !== null){  // just to make sure the bookmaker exists
    DB::table('bookmaker_user')
        ->where('id', $id)
        ->update(array('bookmaker_id' => $bookmodif->id);
}

答案 1 :(得分:0)

我一直在处理这件事。你可以这样做:

getAllStageItems(){
     this.etprofile.getetudiant().subscribe((data: any) => {
        this.etudiantstage = data
        console.log(this.etudiantstage);

    // <= getting data and execute these logic here
    console.log(this.etudiantstage);

    for(let item in this.etudiantstage){
        console.log(this.etudiantstage[item].cin);
        if(this.etudiantstage[item].cin == this.cin)
        this.validerAffiche = true;}
    });       
}