2015-09-01 5 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

Почему я не забирающий свои данные баннерной !? (Переменная title в тегах h2 выводится нормально, поэтому db и все до этой точки работают.) Спасибо.

ответ

2

Вы должны указать полный «путь» к модели в отношениях включая пространство имен:

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

} 

И то же самое на belongsTo:

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», относится к части «баннер». Какой беспорядок! Как только я исправил это, и пространство имен из ответа выше, это сработало! Я очень ценю помощь. – Leon

+0

Рад, что я мог помочь! Счастливое кодирование :) – jakehallas

Смежные вопросы