2015-04-03 2 views
1

Я пытаюсь создать систему обмена сообщениями для сайта работы с использованием Laravel 5 и использования Eloquent ORM. Основная предпосылка заключается в том, что кто-то отправляет задание, и люди могут отвечать на это задание посредством сообщения. База данных MySQL структурирована так:Laravel Яркие отношения и подключение нескольких таблиц

**users table** 
id 
username 
password 

**jobs table** 
id 
user_id (FK with id on Users table) 
slug 
title 
description 

**conversations table** 
id 
job_id (FK with id on Jobs table) 

**messages table** 
id 
conversation_id (FK with conversations table) 
user_id (FK with id on users table) 
message 
last_read 

**conversation_user table** 
conversation_id (FK with id on Conversation table) 
user_id (FK with id on Users table) 

Когда пользователь находит работу им нравится, они могут отправить сообщение на работу создателя, которое в свою очередь, создать новый разговор. Затем вновь созданный идентификатор разговора передается в таблицу сообщений (рядом с текстом сообщения), а затем сводная таблица talk_user обновляется идентификатором беседы, а также двумя пользователями, которые участвуют в разговоре (т.е. работа и человек, посылающий сообщение)

у меня есть модель для каждой таблицы и краткое описание отношений являются:

**Job.php** 
HasMany - Conversation model 
BelongsTo - User model 

**Conversation.php** 
BelongsTo - Job model 
HasMany - Message model 
BelongsToMany - User model 

**Message.php** 
BelongsTo - Conversation model 
BelongsTo - User model 

**User.php** 
HasMany - Job model 
HasMany - Message model 
BelongsToMany - Conversation model 

Я установки области действия запроса в Conversation.php (мой Eloquent модель таблица «Разговоры»), которая выполняет задачу отображения разговоров, в которых участвует аутентифицированный пользователь:

public function scopeParticipatingIn($query, $id) 
{ 
    return $query->join('conversation_user', 'conversations.id', '=', 'conversation_user.conversation_id') 
     ->where('conversation_user.user_id', $id) 
     ->where('conversation_user.deleted_at', null) 
     ->select('conversations.*') 
     ->latest('updated_at'); 
} 

и через мой Бесед Repository, я прохожу по результатам объема запроса на мой взгляд, в моем MessagesController так:

public function __construct(ConversationInterface $conversation) 
{ 
    $this->middleware('auth'); 
    $this->conversation = $conversation; 
} 

public function index() 
{ 
    $currentUser = Auth::id(); 

    $usersConversations = $this->conversation->ParticipatingIn($currentUser, 10); 

    return view('messages.index')->with([ 
     'usersConversations' => $usersConversations 
    ]); 
} 

и обращении ConversationInterface ограничена моей ConversationsRepo:

public $conversation; 
private $message; 

function __construct(Model $conversation, MessageInterface $message) 
{ 
    $this->conversation = $conversation; 
    $this->message  = $message; 
} 

public function participatingIn($id, $paginate) 
{ 
    return $this->conversation->ParticipatingIn($id)->paginate($paginate); 
} 

Мой вопрос в том, что у меня есть то, что я считаю правильными отношениями, как я могу передать заголовок конкретного задания из job_id в таблице цепочек, а также первые несколько слов последнего сообщения который был отправлен в рамках разговора?

ответ

1

Я извиняюсь, если я констатирую очевидное, но:

Жанровая модель относится к работе модели. Как вы уже объектный разговор/идентификатор, просто сделать это:

//Controller 
$conversation = App\Conversation::find($id); 
return view('your view', compact('conversation')); 

//View 
$conversation->job->title; //the conversation belongs to a job, so requesting the job will return an instance of the job model, which can be asked for the title. 

Вы также можете использовать это на представлении, чтобы получить первые символы из сообщения:

substr($conversation->messages->last()->message,0,desired lenght); 
Смежные вопросы