2013-05-11 5 views
0

У меня есть несколько связанных моделей:метод не определен в классе Query

Client 
id, name, user_id ++ 

Projects 
id, title, client_id, user_id ++ 

Users 
id, name ++ 

Клиент принадлежит пользователю, и клиент имеет много проектов, и проект принадлежит к клиенту и пользователю.

Когда я пытаюсь следующий запрос, чтобы получить проекты для клиента, я получаю сообщение об ошибке говорящего

Method [projects] is not defined on the Query class.

Что это значит?

Я попытался следующие запросы:

Client::find(2)->where('user_id', '=', Auth::user()->id)->projects() // Throws error 
Client::where('id', '=', 2)->where('user_id', '=', Auth::user()->id)->projects() // Also throwing an error 

Следующий запрос работает отлично:

Client::find(2)->projects 

Мои модели просты и выглядит следующим образом:

<?php 

class Client extends Eloquent 
{ 
    public static $timestamps = TRUE; 

    public function user() 
    { 
     return $this->belongs_to('User'); 
    } 

    public function projects() 
    { 
     return $this->has_many('Project'); 
    } 
} 

class Project extends Eloquent 
{ 
    public static $timestamps = TRUE; 

    public function client() 
    { 
     return $this->belongs_to('Client'); 
    } 

    public function user() 
    { 
     return $this->belongs_to('User'); 
    } 
} 

class User extends Eloquent 
{ 
    public static $timestamps = TRUE; 

    public function clients() 
    { 
     return $this->has_many('Client'); 
    } 

    public function projects() 
    { 
     return $this->has_many('Project'); 
    } 
} 

Почему выиграл «Это работает, когда я использую там предложения? Он работает, когда я не использую предложения where, но мне нужно также фильтровать проекты и клиентов на user_id. (Мой план, чтобы дать возможность нескольким пользователям, подключенным к компании, чтобы увидеть все свои проекты и клиенты.)

+1

Может быть, это потому, что метод «где» возвращает некоторый новый экземпляр класса Query , а не $ это? – rMX

ответ

2

Вы на самом деле ничего из запроса не загружается, просто добавьте first() или добавить get() затем петлю и вызвать ваш projects().

Должно работать так:

Client::where('id', '=', 2)->where('user_id', '=', Auth::user()->id)->first()->projects() 

И в соответствии с Вашим комментарием, он должен работать также для одной строки:

Client::find(2)->projects()->where('user_id', '=', Auth::user()->id); 
+0

Я получил еще один ответ от форумов Laravel: 'Client :: find (2) -> projects() -> где ('user_id', '=', Auth :: user() -> id)' Какой из них был бы самый эффективный? –

+0

Если вы хотите получить только одну строку, то оба должны работать. – Usman

+0

Хорошо, спасибо :) –