我有一个报价模型:
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
答案 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_lines
或Quote::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)
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');