Laravel 4 - 无法以一对多关系检索数据

时间:2013-07-29 12:48:18

标签: laravel 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控制器访问引用行:

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

只返回NULL

5 个答案:

答案 0 :(得分:7)

关系的方法名称必须是正确的camel-case才能使用magic属性。例如,为了使用Quote::find($id)->quote_lines,该方法必须命名为quoteLines()

请允许我解释一下:

调用Quote::find($id)->quote_lines;激活Eloquent类中的magic __get方法。 __get()在要检索的属性上调用getAttribute($key)。所以在这种情况下,它会调用getAttribute('quote_lines')

如果模型的属性数组中没有键(quote_lines),它将在类中搜索方法。它通过camel_case()转换密钥来实现。 Laravel的camel_case()方法会将quote_lines转换为quoteLines。然后它会在你的类中查找名为quoteLines()的函数,并在找到它时将其视为关系方法。

因此,关系方法必须写为quoteLines。 (或任何适当的骆驼案例字符串)

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

然后,您可以使用Quote::find($id)->quote_linesQuote::find($id)->quoteLines来访问此关系(两者都可以作为'quote_lines'和'quoteLines'评估为'quoteLines',当驼峰时。)

脚注:laravel中的“camel case”指的是这种形式的字符串:heyThereWorld。 第一个字母必须是小写,并且所有后续单词的首字母必须大写

答案 1 :(得分:4)

我对Laravel 4.1有完全相同的问题,this comment建议的解决方案为我解决了这个问题。

在函数名称中的下划线 会导致它返回null

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

删除下划线可解决此问题。显然,Eloquent不喜欢在函数名中加上下划线。

但是,请注意,函数名称必须匹配任何架构的列名称,否则您将遇到其他问题。

答案 2 :(得分:3)

您没有调用该函数,但是您想要获取名为$quote_lines的变量。 请尝试拨打$quote_lines = Quote::find($id)->quote_lines();

答案 3 :(得分: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');
}

希望它有助于其他人

答案 4 :(得分:0)

至少,它应该返回一个空洞的雄辩对象。

QuoteLine模型中,确保告诉Eloquent您的表名。

public $table = 'quote_lines';

Quote模型上设置关系时,请确保它知道您的外键链接到quote_lines表格的内容。

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