2015-09-01 28 views
2

我是Laravel的新手,並且使用Laravel 5,我無法從數據庫返回數組。Laravel 5 - 如何返回oneToMany關係?

我有幾個「行爲」,每個行爲都有很多「橫幅」。每當我嘗試從我的橫幅數組輸出($ act-> banners-> count()),我發現它會拋出一個錯誤,因爲它是空的。

下面是代碼:

routes.php文件:

Route::model('banners', 'Banner'); 
Route::model('acts', 'Act'); 

// Controller routes 
Route::resource('acts', 'sf_ActController'); 
Route::resource('acts.banners', 'sf_BannerController'); 


Route::bind('banners', function($value, $route) { 
    return App\Banner::whereact_id($value)->first(); 
}); 
Route::bind('acts', function($value, $route) { 
    return App\Act::whereact_id($value)->first(); 
}); 

Act.php(模型)

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Act extends Model 
{ 
protected $table = 'sf_act'; 
protected $primaryKey = 'act_id'; 

public function act() { 
     return $this->hasMany('Banner'); 

    } 
} 

Banner.php(模型)

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Banner extends Model 
{ 

    protected $table = 'sf_banner'; 
    protected $primaryKey = 'banner_id'; 

    public function banner() { 
     return $this->belongsTo('Act' , 'act_id' , 'act_id'); 
    } 
} 

sf_ActController.php(控制器)

namespace App\Http\Controllers; 
use Illuminate\Http\Request; 

use App\Act; 
use App\Banner; 
use App\Http\Requests; 
use App\Http\Controllers\Controller; 

use Input; 
use Redirect; 

class sf_ActController extends Controller 
{ 
    public function show(Act $act) 
    { 

    //pass object to correct view 
    return view('pages.acts.show' , compact('act'))->with('banner', Banner::find($act)); 
    } 

行爲/ show.blade.php(圖)

<!-- /resources/views/acts/show.blade.php --> 
@extends('app') 

@section('content') 
<h2>{{ $act->act_title }}</h2> 

    {{ $act->banners->count() }} 

在這一點上,我得到以下錯誤:

FatalErrorException in a03036ad81fb4e6d90e9fe5e3da62c65 line 7: Call to a member function count() on null

爲什麼我沒有取我的旗幟數據!? (h2標籤中的標題變量輸出很好,所以數據庫和所有的東西直到那一刻都在工作。)謝謝。

回答

2

您需要指定包含命名空間的關係完整的「路線」的模式:

public function act() { 
    return $this->hasMany('App\Banner'); 

} 

而就屬於關聯相同:

public function banner() { 
    return $this->belongsTo('App\Act' , 'act_id' , 'act_id'); 
} 

可能是個好主意在hasMany方法中包含外國人的名字。

public function act() { 
    return $this->hasMany('App\Banner', 'act_id'); 

} 

也可能你不需要在屬於的第三個參數。

希望它有幫助。還可以與你分享一個鏈接,瞭解Laravel一步一步:Learn Laravel 5.0 => 5.1

+0

謝謝你,你絕對是對的!還有另一個問題在下面的答案中被指出,一個名稱錯誤的函數......一旦這兩件事情得到修復,它就完美了!沒有你的幫助,我無法做到! – Leon

+0

太棒了!我很高興它有幫助。最好的祝願。 – JuanDMeGon

1

您目前有你hasMany關係的設置是這樣的:

public function act() { 
    return $this->hasMany('Banner'); 

} 

但是在你看來你調用這個關係:

$act->banners->count()

它不應該是:

$act->act()->count();

+0

謝謝。你的評論幫助我弄清楚了。我錯誤地命名了這些功能! '$ act-> banner-> count()'是正確的,但是您可以在上面的「Act」模型中看到名爲「Act」的函數引用「banner」部分。真是一團糟!一旦我解決了上述問題,並從上面的答案中解決了命名空間問題,它就起作用了我非常感謝幫助。 – Leon

+0

很高興能幫到你!快樂編碼:) – jakehallas