У меня две таблицы
Одна запись QUESTIONS_TITLES имеет много записей QUESTIONS. Названия содержат группу вопросов.
ВОПРОСЫ
id | вопрос | … | question_titles_id
QUESTIONS_TITLES
id | заглавие
МОДЕЛЬ ВОПРОС
class Question extends \Eloquent {
public function questionTitle() {
return $this->belongsTo('QuestionsTitle', 'question_titles_id');
}
}
МОДЕЛЬ ВОПРОС
class QuestionsTitle extends \Eloquent {
protected $fillable = ['title', 'question_cat_id', 'type'];
protected $table = 'questions_titles';
public function question() {
return $this->hasMany('Question');
}
}
в моем контроллере вопросов я делаю:
$questions = Question::all();
$this->layout->content = View::make('questions.index', compact('questions'));
на мой взгляд, я хочу группу вопросов с соответствующим родительским названием
@foreach ($questions as $question)
<tr>
<td>{{ $question->questionTitle()->first()->title }}</td>
<td>{{ $question->id }}</td>
<td>{{ $question->question }}</td>
</tr>
@endforeach
это работает. но зачем мне сначала ()? это не выглядит чистым
когда я бросаю это, я получаю
Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$title (View: /vagrant/app/views/questions/index.blade.php)
$question->questionTitle()
возвращает объект BelongsTo, а не объект QuestionTitle. Когда вы звоните $question->questionTitle()->first()
вы исполняете first()
метод на отношения. Это благодаря магии ларавеллы дает вам правильный ответ. Хотя то, что вы действительно должны делать, это: $question->questionTitle->title
, Когда вы получаете доступ к questionTitle
Атрибут Laravel автоматически разрешает отношения для вас.
Других решений пока нет …