2016-11-21 5 views
1

Ich habe zwei Modelle, eines ist LeadHistory und das andere ist Leads.Einfache Laravel Beziehung

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'); 
    } 
} 

Wenn ich in php basteln gehen, erhalten die erste Leitung ($ Blei = App \ Leads :: first();) erstellen neue LeadHistory ($ leadHistory = neue App \ LeadHistory;) und ($ leadHistory-> message = 'second one';) und ($ leadHistory-> status_id = 11;) dann versuch die leadHistory ($ leadHistory-> lead () -> speichern ($ führen);). Ich bekomme diese Fehlermeldung:

BadMethodCallException mit Meldung 'Call to undefined Methode Illuminate \ Database \ Abfrage \ Builder :: save()'

Kann mir jemand in die richtige Richtung, ich fühle mich wie ich gewesen Befolgen Sie die Anweisungen in Laracasts, aber es scheint nicht möglich zu sein, die LeadHistory mit der zugehörigen Lead-ID zu speichern.

Antwort

1

Versuchen $leadHistory zuerst zu speichern:

$leadHistory->save(); 

Und dann:

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

Erhalte den Fehler: Illuminate \ Database \ QueryException mit Nachricht 'SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte' leads_id 'in' Feldliste '(SQL: update 'lead_histories' Satz' updated_at' = 2016-11 -21 09:54:53, 'leads_id' = 363106 wo 'id' = 3) mit deiner Lösung, mit 5.1 glaube ich. –

+0

@DavidJarrin Erstellen Sie 'leads_id' in der Tabelle des' LeadHistory' Modells. Es enthält die ID eines Leads. –

+1

Das hat den Trick, danke Alexey. –

1

Sie versuchen save() auf einer Beziehung zu nennen eher als ein Modell, das ich denke.

Stattdessen „anhängen“ Ihr LeadHistory Modell Ihrem Lead Modell:

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

$history = new LeadHistory($leadHistoryAttributes); 

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

Sie müssen Ihre Beziehung benennen, wenn Sie kopieren und fügen Sie den obigen Code:

class Lead extends Model 
{ 
    public function history() 
    { 
     return $this->hasMany(LeadHistory::class); 
    } 
} 

Ich denke, der Name "Lead History" ist überflüssig, wenn Sie bereits mit einem Lead Modell arbeiten.

+0

Erhalte den Fehler BadMethodCallException mit der Nachricht 'Call to undefined Methode Illuminate \ Database \ Query \ Builder :: attach()' mit dieser Methode, sollte erwähnen, ich verwende 5.1 Ich glaube. –

0

mich korrigieren, wenn ich falsch bin, aber da Sie bereits eine Modellinstanz Ihres Ziels App\Leads haben, ich glaube, Sie sollten einfach in der Lage sein, die ID dieser Instanz zugreifen und sie in einen statischen erstellen Aufruf injizieren:

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

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

Bevor die create Methode verwenden zu können, würden Sie Sie die gewünschten Eigenschaften machen müssen ‚belegbare Masse‘ zuweisen, indem eine geschützte Eigenschaft definieren $fillable in Ihrem Modell genannt:

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

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

Dieser Wille Verknüpfen Sie Ihre neue Aufzeichnung effektiv mit dieser Ableitung, da das Eloquent-Modell in dieser Hinsicht nur eine andere Möglichkeit bietet, die gleichen Beziehungen zu beschreiben, die Ihre Datenbank ausübt.

Einige andere Antworten erwähnen die attach() Methode eines redegewandten Modells. Diese Methode wird verwendet, um zwei Modelle mit einer Beziehung "Viele zu Viele" zu verknüpfen (Beziehungen, die mit belongsToMany definiert sind).