2016-02-10 2 views
0

В настоящее время я не знаю, как это сделать умным способом. Я хотел бы запретить писать тонны запросов. Первый мой стол дизайн:laravel5.1 не извлекает напрямую связанные атрибуты с использованием eloquent

users: 
|id|username| 

tickets: 
|id|user_id| 

ticket_replies: 
id|ticket_id|user_id| 

files: 
|id|ticket_replie_id|name 

мои контроллеры:

user: 
public function tickets() 
    { 
    return $this->hasMany('App\ticket'); 
    } 

ticket: 
public function ticket_replie() 
    { 
    return $this->hasMany('App\ticket_replie', 'ticket_id', 'id'); 
} 

ticket_replie: 
public function file() 
{ 
     return $this->hasOne('App\File', 'ticket_replie_id', 'id'); 
} 

Отношение, как следующее, пользователь имеет много билетов. У каждого билета много билетов. Файл ticket_replie имеет одно вложение (файл). Теперь мне нужно получить имя файла для данного билета & ticket_replie_id. В мой контроллер я использую это на данный момент:

$ticket = Auth::user()->tickets()->where('tickets.id', $id)->where('files.ticket_replie_id', $attachment_id)->firstOrFail(); 

Laravel генерирует мне этот запрос & ошибку:

select * from `tickets` where `tickets`.`user_id` = 1 and `tickets`.`user_id` is not null and `tickets`.`id` = 43 and `files`.`ticket_replie_id` = 39 limit 1 

Column not found: 1054 Unknown column 'files.ticket_replie_id' in 'where clause 

Запрос должен быть что-то вроде:

select * from `tickets`, `files` where `tickets`.`user_id` = 1 and `tickets`.`user_id` is not null and `tickets`.`id` = 43 and `files`.`ticket_replie_id` = 39 limit 1 

Когда я бегу этот запрос в моей базе данных, он возвращает необходимую информацию. Мой способ получить информацию в порядке? Где моя ошибка, потому что на данный момент запрос, созданный Eloquent, не работает, как описано выше. Если есть более простой способ, просто скажите мне. Кажется, что красноречие не может получить связь между билетом и файлом. Как сказать красноречивым, есть отношение, использующее ticket_replie?

ответ

0

Если вы уже знаете ticket_replie_id все, что вам нужно сделать, это:

File::where('ticket_replie_id', $ticket_replie_id)->first(); 

В более общей ситуации, вы обратитесь к Eager Loading.

+0

Я бы хотел проверить, разрешен ли пользователь загрузить этот файл (без того, чтобы пользователи могли «угадать» идентификаторы и загрузить файлы, которые не связаны с ними), поэтому я хотел бы использовать путь с 'Auth :: user() -> tickets()'. Есть идеи, как это сделать? –

+0

Я бы сначала идентифицировал файл и после этого проверил разрешения пользователя –

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