2016-11-21 3 views
1

У меня две модели: одна - LeadHistory, а другая - Leads.Простые отношения с Laravel

Ведет:

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 повозиться, получить первый свинец ($ свинец = App \ Ведет :: первого();), создать новый LeadHistory ($ leadHistory = новое приложение \ LeadHistory;) и ($ leadHistory-> message = 'second one';) и ($ leadHistory-> status_id = 11;) затем попытайтесь сохранить leadHistory ($ leadHistory-> lead () -> сохранить ($ свинца);). Я получаю сообщение об ошибке:

BadMethodCallException с сообщением «Призыв к неопределенным метод Осветите \ Database \ Query \ Builder :: сохранить()»

Может кто-то мне точку в правильном направлении, я чувствую, что я был следуя инструкциям, приведенным в Laracasts, но не может заставить LeadHistory сохранить с соответствующим идентификатором Lead.

ответ

1

Попробуйте сохранить $leadHistory первый:

$leadHistory->save(); 

А потом:

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

получение ошибки: Illuminate \ Database \ QueryException с сообщением «SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец« lead_id »в« списке полей »(SQL: обновление' lead_hystories' set 'updated_at' = 2016-11 -21 09:54:53, 'lead_id' = 363106 где' id' = 3) 'с вашим решением, используя 5.1, я считаю. –

+0

@DavidJarrin создайте 'lead_id' в таблице модели LeadHistory. Он будет содержать идентификатор ведущего. –

+1

Это сделало трюк, спасибо Алексею. –

1

Вы пытаетесь вызвать 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); 
    } 
} 

Я чувствую, что название «история свинца» излишне, когда вы уже работаете с моделью Lead.

+0

получение ошибки BadMethodCallException с сообщением «Вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: attach()» с помощью этого метода, должен упомянуть, что я использую 5.1, я считаю. –

0

Поправьте меня, если я ошибаюсь, но так как у вас уже есть модель экземпляр вашей цели App\Leads, я думаю, вы должны быть в состоянии просто получить доступ к идентификатору этого экземпляра и ввести его в статический создать вызов:

$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 в этом отношении, - это еще один способ описать те же отношения, что и ваша база данных.

В некоторых других ответах упоминается метод изящной модели attach(). Этот метод используется для присоединения двух моделей со многими отношениями (отношения, определенные с помощью belongsToMany).