逻辑复合体插入下面的两个表 - Laravel

时间:2018-02-09 12:15:30

标签: php laravel

我有一个房屋管理项目,我正在尝试执行一个复杂的功能,包括: 每次我将新的账单插入数据库时​​,将填写另一个表格,根据此房屋的室友数量为该账单的每一份创建一个新行。我设法插入Bills表,但该程序将我返回到预期的页面,但没有插入到Shares表中。不确定逻辑上我是否正常。下面的代码是我如何尝试检索最后一个插入到Bills表中的信息,然后应该将其对象属性用于Shares表。有人对我如何进行有任何线索吗?

这是我的控制器功能:

public function store(Request $request){

        $bill = Bill::create($request->all());

        $users = User::where('house_id', Auth::user()->house->id);
        $nflatmates = Auth::user()->house->nflatmates;
        $shared_amount = $bill->bill_amount / $nflatmates;

        foreach($users as $user){

            $data = ['user_id'=>$user->id,
                     'bill_id'=>$bill->id,
                     'share_amount'=>$shared_amount];

            Share::create($data);

        }

        return redirect('/admin/bills');


    }

这是我的表格刀片。我相信问题不会来自这里。以防万一。

{!! Form::open(['method'=>'post', 'action'=>'AdminBillsController@store']) !!}

                            <div class="form-group' has-error' : '' }}">
                                <div class="col-md-6">
                                    {!! Form::text('description',null,['class'=>'form-control', 'placeholder'=>'Bill Description']) !!}
                                </div>
                            </div>

                            <div class="form-group' has-error' : '' }}">
                                <div class="col-md-6">
                                    {!! Form::number('bill_amount',null,['class'=>'form-control', 'placeholder'=>'Amount', 'required|between:0,99.99']) !!}
                                </div>
                            </div>

                            <input type="hidden" name="house_id" value="{{Auth::user()->house->id}}">

                            <br>

                            <div class="form-group">
                                <div class="col-md-6 col-md-offset-4">
                                    <button type="submit" class="btn btn-primary">
                                        Register
                                    </button>
                                </div>
                            </div>
                            {!! Form::close() !!}

这些是我的关系:

这是分享模式

<?php

namespace App;
use App\User;
use App\Bill;


use Illuminate\Database\Eloquent\Model;

class Share extends Model{

    protected $fillable = [
        'id', 'user_id', 'bill_id', 'share_amount', 'share_status'
    ];


    public function user(){

        return $this->belongsTo('App\User');

    }

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


}

这是比尔模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\House;
use App\User;
use App\Share;

class Bill extends Model{


    protected $fillable = [
        'id', 'description', 'bill_amount', 'house_id'
    ];


    public function house(){

        return $this->belongsTo('App\House');

    }

    public function share(){
        return $this->hasMany('App\Share');
    }



}

这是用户模型:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\House;
use App\Role;
use App\Task;
use App\Share;


class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'id','name', 'email', 'is_active','house_id','role_id','password',
    ];


    protected $hidden = [
        'password', 'remember_token',
    ];


    public function house(){

        return $this->belongsTo('App\House');

    }

    public function role(){

        return $this->belongsTo('App\Role');
    }


    public function task(){

        return $this->hasMany('App\Task');

    }


    public function share(){

        return $this->hasMany('App\Share');

    }

}

这就是房子型号:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\User;
use App\Bill;

class House extends Model {

    protected $fillable = [

        'id','house_address', 'house_admin', 'nflatmates'

    ];


    public function user(){

        return $this->hasMany('App\User');

    }


    public function bill(){

        return $this->hasMany('App\Bill');

    }



}

Error

1 个答案:

答案 0 :(得分:0)

问题是你在那里显然有oneToMany的关系,所以你想做的就是这样。

public function store(Request $request){

    $bill = Bill::create($request->all());

    $users = User::where('house_id', Auth::user()->house->id);
    $nflatmates = Auth::user()->house->nflatmates;
    $shared_amount = $bill->bill_amount / $nflatmates;

    foreach($users as $user){

        $data = [
           'share_amount' => $shared_amount,
           'share_status' => 'XXXXXX'
        ];

        $share = new Share($data);
        //Associating user with this share
        $share->user()->associate($user);
        //Associating bill with this share
        $share->bill()->associate($bill);
        //Saving share
        $share->save();
    }

    return redirect('/admin/bills');


}

编辑:

为了使上述代码有效,您必须在模型中设置有效的关系。

编辑2:

我认为nflatmates是一种oneToMany关系,但它并不是attach函数所必需的。

我们现在正在创建一个Share对象,并通过它定义的关系我们使用基于associate的{​​{1}}函数,您可以在official docs找到该函数,只需向下滚动一下。