2013-07-29 81 views
2

我有一個報價模型無法檢索數據: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

回答

7

爲了使用魔術屬性,關係的方法名稱必須是正確的駱駝案例。例如,爲了使用,Quote::find($id)->quote_lines,該方法必須命名爲quoteLines()

讓我解釋一下:

調用Quote::find($id)->quote_lines;激活雄辯類魔法__get方法。 __get()在正在檢索的屬性上調用getAttribute($key)。因此,在這種情況下,它調用getAttribute('quote_lines')

如果鍵(quote_lines)在模型的attributes數組中不可用,它將代替在類中搜索方法。它通過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」時camel- )

腳註:laravel中的「camel case」指這種形式的字符串:heyThereWorld。 第一個字母必須是小寫,而隨後的所有單詞的第一個字母必須大寫

+0

所以,我有shoppingMalls()期待成爲像$ this-> shopping_malls這樣的動態屬性,但不是,它會返回null。任何人都知道在未來的laravel版本中是否會發生變化? –

+0

@JosePalazuelos是shopping_malls一個屬性或關係?一個屬性需要方法名稱getShoppingMallsAttribute() – TonyArra

+0

這是一種關係,我沒有一個名爲shopping_malls的屬性。我不知道爲什麼不轉換成snake_case。我只是將名稱改爲一個詞,只是爲了按預期工作。 –

3

你不叫函數,但是您想要獲取名爲$quote_lines的變量。 嘗試撥打$quote_lines = Quote::find($id)->quote_lines();代替。

+1

雄辯使用什麼所謂的魔法屬性,我相信。他所擁有的是正確的,並且/應該工作。 – user1669496

+1

奇怪的是,當調用'$ quote_lines = Quote :: find($ id) - > quote_lines() - > get();'它工作。這裏有一個問題,'$ quote_lines = Quote :: find($ id) - > quote_lines;'應該也可以。 – maunoxyd

+3

我剛剛測試了你的東西,並提出了空值。解決這個問題的方法是將'public function quote_lines()'改爲'public function quoteLines()',然後使用'$ quote_lines = Quote :: find($ id) - > quoteLines'。不知道爲什麼這有所作爲,但它爲我做了。 – user1669496

0

至少,它應該返回一個空的雄辯對象。

在你的QuoteLine模型中,確保你告訴Eloquent你的表名。

public $table = 'quote_lines';

在您Quote模型建立的關係,肯定知道你的外鍵鏈接到您的quote_lines表什麼。

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

+0

那麼,外鍵是在quote_lines表上,不是它應該如何設置? – maunoxyd

4

我有Laravel 4.1完全相同的問題,並提出this comment解決方案解決了這個問題對我來說。

函數名把下劃線任何地方使其返回null

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

刪除下劃線解決問題。很顯然,Eloquent不喜歡在函數名中使用下劃線。

但是,請注意,函數名稱必須爲而不是與模式的任何列名稱匹配,否則您將遇到其他問題。

+0

具體而言:在編寫關係方法時,方法名稱不能有下劃線。正在使用的魔術屬性必須在通過camel_case()傳遞時刪除空格,下劃線和連字符來評估方法名稱。 – TonyArra

+0

@TonyArra你怎麼知道這個?它是否記錄在某處? – Virtlink

+0

不,我剛讀過大部分的Eloquent源代碼。在上面檢查我的答案。另外,儘量不要在這樣的真正舊線程上發佈答案。當我回答時,我沒有意識到你已經恢復了它。 – TonyArra

1

像@Virtlink和@TonyArra說,如果你在關係功能單元使用駝峯名(此解決方案爲我)這個錯誤被修正。比如我有

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

希望它可以幫助別人