Laravel 不保存一对多关系

Posted

技术标签:

【中文标题】Laravel 不保存一对多关系【英文标题】:Laravel doesn't save one-to-many relation 【发布时间】:2019-10-14 07:36:28 【问题描述】:

我尝试使用 push() 和 add(),但即使使用 save() 方法也无法正常工作。

我附加了代理和合同模型,代理应该有多个合同或根本没有合同 这是我的解决方案,但合同没有保存给代理!

//Agent class
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Agent extends Model

    protected $table = "agent";
    protected $fillable = [
        'agent_name', 'agent_website', 'agent_main_contact_name' ,'agent_moto','agent_business', 'tier', 'class', 'status', 'agent_contact_info', 'agent_image_path','contract'
    ];

    // protected static function boot()
    // 
    //     parent::boot();
    //     //fired whenever a new user is created
    //     static::created(
    //         function ($agent)
    //             $agent->contracts()->create([
    //                 'contract_name' => 'No Contract',
    //             ]
    //         );
    //         //Mail::to($agent->email)->send(new NewUserWelcomeMail());
    //         
    //     );
    // 

    public function contracts()
        return $this->hasMany(Contract::class)->orderBy('created_at', 'DESC');
    


// Contract model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Contract extends Model

    protected $fillable = [
        'contract_name', 'contract_start_date', 'contract_end_date' ,'contract_status','contract_description'];
    protected $table = "contract";
    protected $guarded =[];
    public function agent()
    
        return $this->belongsTo(Agent::class);
    




//AgentController where the Agent is created
 public function store(Request $request)
    
        //dd($request->contract);
        $this->validate($request, ['agentName' => 'required', 'agentBusiness' => 'required', 'status' => 'required']);

        $agent = new Agent();
        $agent->agent_name = $request->agentName;
        $agent->agent_website = $request->agentWebsite;
        $agent->agent_main_contact_name = $request->agentMainContactName;
        $agent->agent_moto = $request->agentMoto;
        $agent->agent_business = $request->agentBusiness;
        $tierId = $request->tier;
        $classId = $request->class;
        $statusId = $request->status;
        $agent->agent_contact_info = $request->agentContactInfo;
        $contractId= $request->contract;

        // $data = [
        //     'image' => '',
        // ];
        try
        
            //dd($request->contract);
           // dd($contractId);
            $contract = Contract::find($contractId);
            //dd($contract);
            // $tier = Tier::find($tierId);
            // $class = Classes::find($classId);
            // $status = Status::find($statusId);
            $agent->contracts->push($contract);

            //dd($contract);


        
        // catch(Exception $e) catch any exception
        catch(ModelNotFoundException $e)
        

        
        $tiers = Tier::select('tier_name')->where('id', $tierId)->get('tier_name');
        foreach($tiers as $tier) 
            $tierName = $tier->tier_name;
        
        $classes = Classes::select('class_name')->where('id', $classId)->get();
        foreach($classes as $class) 
            $className = $class->class_name;
        
        $statuss = Status::select('status_name')->where('id', $statusId)->get();

        foreach($statuss as $status) 
            $statusName = $status->status_name;
        
        $agent->tier = $tierName;
        $agent->class = $className;
        $agent->status = $statusName;



        $agent->save();
        //dd($agent);

        session()->flash('Success', 'Agent Added Successfully');

        return back();

    

【问题讨论】:

我刚试过这个 $agent->contracts()->save($contract);这是带有消息'SQLSTATE [23000]的输出Illuminate / Database / QueryException:完整性约束违规:1048列'agent_id'不能为空(SQL:插入contractagent_idupdated_atcreated_at ) 值 (?, 2019-10-14 08:07:44, 2019-10-14 08:07:44))' 如果我强制数据库为空并重试这一行,这是输出 $agent->contracts()->save($contract) => App\Contract #3147 agent_id: null , updated_at: "2019-10-14 08:07:44", created_at: "2019-10-14 08:07:44", id: 1, agterwars 我试过这个 $agent->contracts => Illuminate\Database \Eloquent\Collection #3156 all: [], 您能否更好地解释这一点?就像错误到底出现在哪里以及错误是什么?也许你想要完成的事情。如果没有这些信息,为您调试它有点困难。 我认为你必须保存代理,$agent->save();然后你就可以推送你的合约了。 @UdhayanNair 每个代理都可以有一个或多个合同,每当用户发送 POST 请求时,服务器都会调用此存储方法,用户从 html 选择元素中选择合同 ID,然后将其传递给store 方法,然后该方法搜索具有此特定 ID 的合同并对其进行引用并将其附加到新创建的代理错误是合同未保存 【参考方案1】:

这为我解决了 //dd($request->contract); // dd($contractId); $agent->保存(); $contract = Contract::find($contractId); //dd($合约); // $tier = Tier::find($tierId); // $class= 类::find($classId); // $status = Status::find($statusId); $agent->contracts()->save($contract); $合约->保存(); //dd($contract);

【讨论】:

以上是关于Laravel 不保存一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 一对多关系上的保存方法的对立面是啥?

Laravel Eloquent - 保存/更新相关的一对多关系数据

Laravel 5.8 在数据透视表上保存一对多关系

Laravel SUM 一对多(逆)/属于关系

Laravel 雄辩的一对多关系

Laravel 一对多关系不起作用 - 返回递归