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_lines = Quote::find($id)->quote_lines;
dd($quote_lines);

只返回 NULL

4

5 回答 5

7

关系的方法名称必须采用正确的驼峰式格式才能使用魔法属性。例如,为了使用 ,Quote::find($id)->quote_lines方法必须命名quoteLines()

请允许我解释一下:

调用Quote::find($id)->quote_lines;会激活 Eloquent 类中的神奇 __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_linesor访问此关系Quote::find($id)->quoteLines(当骆驼大小写时,两者都将作为 'quote_lines' 和 'quoteLines' 评估为 'quoteLines'。)

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

于 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

至少,它应该返回一个空的 eloquent 对象。

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

public $table = 'quote_lines';

Quote模型上设置关系时,请确保它知道链接到quote_lines表的外键是什么。

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

于 2013-07-29T15:21:40.923 回答