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

Другие вопросы по тегам