简单的Laravel关系

时间:2016-11-21 14:33:30

标签: laravel eloquent models relationships

我有两个模型,一个是LeadHistory,另一个是Leads。

信息:

class Leads extends Model
{
    public function lead_history()
    {
        return $this->hasMany('App\LeadHistory');
    }
}

LeadHistory:

class LeadHistory extends Model
{
    public function lead()
    {
        return $this->belongsTo('App\Leads', 'lead_id', 'id');
    }
}

当我进入php修补程序时,获得第一个Lead($ lead = App \ Leads :: first();),创建一个新的LeadHistory($ leadHistory = new App \ LeadHistory;)和($ leadHistory-> message ='second one';)和($ leadHistory-> status_id = 11;)然后尝试保存leadHistory($ leadHistory-> lead() - > save($ lead);)。我收到此错误消息:

BadMethodCallException,带有消息'调用未定义的方法Illuminate \ Database \ Query \ Builder :: save()'

有人能指出我正确的方向,我觉得我一直在遵循Laracasts中给出的说明,但似乎无法使用相关的潜在客户ID保存LeadHistory。

3 个答案:

答案 0 :(得分:1)

首先尝试保存$leadHistory

$leadHistory->save();

然后:

$lead->lead_history()->save($leadHistory)

答案 1 :(得分:1)

你试图在关系上调用4而不是我认为的模型。

相反,请将save()模型“附加”到您的LeadHistory模型:

Lead

如果您复制并粘贴上述代码,则需要重命名关系:

$lead = Lead::create($leadAttributes);

$history = new LeadHistory($leadHistoryAttributes);

$lead->history()->attach($history);

当您使用class Lead extends Model { public function history() { return $this->hasMany(LeadHistory::class); } } 模型时,我觉得“引导历史”这个名称是多余的。

答案 2 :(得分:0)

如果我错了,请纠正我,但由于你已经有了目标App\Leads的模型实例,我认为你应该能够简单地访问该实例的id并将其注入静态创建调用:

$lead = App\Leads::first();

$leadHistory = App\LeadHistory::create([
    'message'   => 'second one',
    'status_id' => 11,
    'lead_id'   => $lead->id
]);

在能够使用create方法之前,您必须通过在模型中定义名为$fillable的受保护属性来创建要分配“质量可分配”的属性:

class LeadHistory extends Model
{
    protected $fillable = [
        'message',
        'status_id',
        'lead_id'
    ];

    public function lead()
    {
        return $this->belongsTo('App\Leads', 'lead_id', 'id');
    }
}

这将有效地将您的新记录与该潜在客户相关联,因为Eloquent模型在这方面做的唯一事情是提供另一种方式来描述数据库运行的相同关系。

其他一些答案提到了Eloquent模型的attach()方法。此方法用于附加具有多对多关系的两个模型(使用belongsToMany定义的关系)。