2

私は引用モデルを持っています:

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 コントローラーから Quote ラインにアクセスできないように見えることです。

$quote_lines = Quote::find($id)->quote_lines;
dd($quote_lines);

NULL を返すだけ

4

5 に答える 5

7

The method name for a relationship MUST be in proper camel-case in order to use the magic property. E.g., In order to use, Quote::find($id)->quote_lines, the method must be named quoteLines()

Allow me to explain:

Calling Quote::find($id)->quote_lines; activates the magic __get method in the Eloquent class. __get() calls getAttribute($key) on the property being retrieved. So in this case, it calls getAttribute('quote_lines')

If the key (quote_lines) is not available in the model's attributes array, it will instead search for a method in the class. It does this by transforming the key via camel_case(). Laravel's camel_case() method will transform quote_lines into quoteLines. It then looks for a function in your class named quoteLines(), and treats it as a relationship method if its found.

Therefore, the relationship method MUST be written as quoteLines. (or any string that is proper camel case)

public function quoteLines() {
  return $this->hasMany('QuoteLine');
}    

You may then access this relationship by using either Quote::find($id)->quote_lines or Quote::find($id)->quoteLines (both will work as both 'quote_lines' and 'quoteLines' evaluate to 'quoteLines' when camel-cased.)

Footnote: "camel case" in laravel refers to a string of this form: heyThereWorld. The first letter must be lowercase, and the first letter of all subsequent words must be capitalized

于 2014-02-07T05:22:39.797 に答える
4

Laravel 4.1でもまったく同じ問題があり、このコメントで提案された解決策で解決しました。

関数名のどこかにアンダースコアを入れると、次のように返されnullます。

public function quo_telines() {
    return $this->hasMany('QuoteLine');
}

アンダースコアを削除すると、問題が解決します。どうやら、Eloquent は関数名にアンダースコアを付けたくないようです。

ただし、関数名はスキーマの列名と一致してはならないことに注意してください。そうしないと、他の問題が発生します。

于 2014-02-07T01:52:52.467 に答える
3

関数を呼び出しませんが、という名前の変数を取得したいとします$quote_lines$quote_lines = Quote::find($id)->quote_lines();代わりに電話してみてください。

于 2013-07-29T14:04:28.767 に答える
1

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

それが他の人に役立つことを願っています

于 2014-08-28T05:06:50.553 に答える
0

少なくとも、空の雄弁なオブジェクトを返す必要があります。

QuoteLineモデルで、Eloquent にテーブル名を伝えていることを確認してください。

public $table = 'quote_lines';

モデルに関係を設定する際には、テーブルQuoteにリンクする外部キーが何であるかをモデルが認識していることを確認してください。quote_lines

return $this->hasMany('QuoteLine','quote_line_id');

于 2013-07-29T15:21:40.923 に答える