Прежде всего, очень важно правильно назвать ваши классы и их отношения.
Laravel делает некоторые предположения о ваших внешних ключах на основе имен ваших классов и определений отношений.Вы также можете указать внешние ключи, если хотите.
Впрочем, вот как я это сделал.
class Channel extends Model
{
protected $fillable = ['title','slug'];
public function discussions()
{
return $this->hasMany('App\Discussion');
}
}
Обратите внимание, что здесь название модели называется Channel.Когда у нас есть это имя класса и отношения, Laravel будет предполагать, что у модели обсуждения есть внешний ключ с именем channel_id
, который он делает.
Вам также необходимо определить обратную связь в вашей модели обсуждения.
class Discussion extends Model
{
public function channel()
{
return $this->belongsTo('App\Channel');
}
}
Теперь сработает следующее:
public function channel($slug)
{
$channel = Channel::whereSlug($slug)->first();
return view('channel')->with('discussion', $channel->discussions);
}
Если вы связаны и не можетеизмените название модели по любой причине, тогда вам нужно указать внешний ключ в ваших определениях отношений.Например:
public function discussions()
{
return $this->hasMany('App\Discussion', 'channel_id');
}
public function channel()
{
// This one can stay the same as Laravel will try to match `channel_id`
// on the discussion table to the id on the channels table
return $this->belongsTo('App\Channel');
}
Для получения дополнительной информации читайте о Красноречивых связях .
Извините, я уже писал об этом, когда @Julien Metral прокомментировал, но этопродолжение того, что он уже сказал:)