2016-02-15 2 views
0

У меня есть следующий метод в моем контроллере.Передача аргумента функции в модели

public function show($semester_name = null) 
     { 
      $semester = $this->getSemester($semester_name); 

      $matches = Match::GetMatches($semester->id); 

      $semesters = Semester::where('active', 1)->orderBy('name')->get(); 

      return view('entities/match.indexMatched', compact('matches', 'semesters')); 
     } 

И этот метод в моей модели:

public function scopeGetMatches($id) 
     { 
      $query = "SELECT 

         some code... 

         WHERE matches.semester_id  = " . $id . " 
         ORDER BY 2, 3, 5, 6 
         "; 

      return DB::select(DB::raw($query)); 
     } 

Но я получаю ошибку Object of class Illuminate\Database\Eloquent\Builder could not be converted to string.

Я точно знаю, что получаю действительный $ semester-> id.

Помогите кому-нибудь?

+0

$ matches = Match :: GetMatches ($ semester-> id); Что это делает ?? – Drudge

+0

или вы можете отправить сообщение, где возникает ошибка, поскольку ваш вопрос не так ясен. – Drudge

ответ

1

Любой метод области видимости принимают в качестве первого экземпляра параметра Illuminate\Database\Eloquent\Builder, таким образом метод должен выглядеть как:

public function scopeGetMatches(\Illuminate\Database\Eloquent\Builder $builder, $id)

В принципе метод охват должен изменить состояние ваш текущий запрос модели, поскольку методы области пропускаются между собой с текущим экземпляром построителя запросов для этой модели - например:

Posts::where('published', true)->newest()->get()

public function scopeNewest($builder) { $builder->orderBy('created_at', 'DESC'); }

такое же, как:

Posts::where('published', true)->orderBy('created_at', 'DESC')->get()

Так реализация ваш неправильно и может быть просто статический метод.

Вы можете найти более подробную информацию о Laravel Docs: https://laravel.com/docs/5.2/eloquent#query-scopes.

+0

Спасибо, сэр. Я только что сделал метод статическим. –

0

Попробуйте это:

$semesters = Semester::where('active','=','1')->orderBy('name')->get();