Laravel 4 - Не удается получить данные в отношении один ко многим
У меня есть модель цитаты:
class Quote extends Eloquent {
public function quote_lines() {
return $this->hasMany('QuoteLine');
}
}
И модель QuoteLine:
class QuoteLine extends Eloquent {
public function quote() {
return $this->belongsTo('Quote');
}
}
Моя таблица для этой модели - quote_lines.
Схема:
Schema::create('quote_lines', function($table)
{
$table->increments('id');
$table->integer('quote_id');
$table->string('title');
$table->string('desciption');
$table->integer('quantity');
$table->decimal('unit_price', 5, 2);
$table->timestamps();
});
Schema::create('quotes', function($table)
{
$table->increments('id');
$table->integer('contact_id');
$table->integer('company_id');
$table->timestamps();
});
Дело в том, что я не могу получить доступ к строкам цитат из моего контроллера котировок:
$quote_lines = Quote::find($id)->quote_lines;
dd($quote_lines);
Просто возвращает NULL
5 ответов
Имя метода для отношения ДОЛЖНО быть в правильном случае верблюда, чтобы использовать магическое свойство. Например, чтобы использовать, Quote::find($id)->quote_lines
метод должен быть назван quoteLines()
Позвольте мне объяснить:
призвание Quote::find($id)->quote_lines;
активирует магический метод __get в классе Eloquent __get() звонки getAttribute($key)
на имущество извлекается. Так что в этом случае он вызывает getAttribute('quote_lines')
Если ключ (quote_lines) недоступен в массиве атрибутов модели, он вместо этого будет искать метод в классе. Это делается путем преобразования ключа через camel_case()
, Метод camel_case() Laravel преобразует quote_lines в quoteLines. Затем он ищет функцию в вашем классе с именем quoteLines() и обрабатывает ее как метод отношений, если он найден.
Следовательно, метод отношения ДОЛЖЕН быть записан как quoteLines. (или любая строка, которая является правильным случаем верблюда)
public function quoteLines() {
return $this->hasMany('QuoteLine');
}
Затем вы можете получить доступ к этим отношениям, используя либо Quote::find($id)->quote_lines
или же Quote::find($id)->quoteLines
(оба будут работать, так как и "quote_lines", и "quoteLines" оцениваются как "quoteLines" в случае верблюдов).
Сноска: "случай верблюда" в laravel относится к строке этого вида: heyThereWorld. Первая буква должна быть строчной, а первая буква всех последующих слов должна быть заглавной
У меня точно такая же проблема с Laravel 4.1, и решение, предложенное в этом комментарии, решило его для меня.
Помещение подчеркивания в любом месте имени функции приводит к ее возвращению null
:
public function quo_telines() {
return $this->hasMany('QuoteLine');
}
Удаление подчеркивания решает проблему. Судя по всему, Eloquent не любит подчеркивания в имени функции.
Однако обратите внимание, что имя функции не должно совпадать ни с одним из имен столбцов схемы, иначе вы получите другие проблемы.
Вы не вызываете функцию, но хотите получить переменную с именем $quote_lines
, Попробуй позвонить $quote_lines = Quote::find($id)->quote_lines();
вместо.
Как @Virtlink и @TonyArra сказали, что эта ошибка исправлена, если вы используете имя camelCase в функциях отношений (это решение работало для меня). Например я имел
public function origin_city()
{
return $this->belongsTo('City', 'origin_city_id');
}
Это не работало, тогда я изменил его на
public function origincity()
{
return $this->belongsTo('City', 'origin_city_id');
}
и это не сработало. Только когда я использовал соглашения о случаях верблюдов, это работало
public function originCity()
{
return $this->belongsTo('City', 'origin_city_id');
}
Надеюсь, что это помогает другим
По крайней мере, он должен возвращать пустой красноречивый объект.
В вашем QuoteLine
модель, убедитесь, что вы говорите Eloquent имя вашей таблицы.
public $table = 'quote_lines';
При настройке ваших отношений на вашем Quote
модель, убедитесь, что он знает, что ваш внешний ключ для ссылки на ваш quote_lines
Таблица.
return $this->hasMany('QuoteLine','quote_line_id');