2016-03-11 5 views
3

Я в настоящее время этот код:Laravel присоединиться к той же таблице 2 столбца

 return Datatable::query($query = DB::table('acquisitions') 
      ->where('acquisitions.deleted_at', '=', null) 
      ->where('acquisitions.status', '!=', 2) 
      ->join('contacts', 'acquisitions.contact_id', '=', 'contacts.id') 
      ->join('user', 'acquisitions.user_id', '=', 'user.id') 
      ->select('contacts.*', 'acquisitions.*', 'acquisitions.id as acquisitions_id', 'user.first_name as supervisor_first_name', 'user.last_name as supervisor_last_name', 'user.id as user_id')) 

Данные из таблицы пользователя используется для 2-х колонок: acquisitions.supervisor_id и acquisitions.user_id. Мне нужны first_name и last_name для обеих этих таблиц. Приведенный выше запрос использует в настоящее время только id из поля acquisitions.user_id. Я также пытался использовать псевдоним таблицы, который тоже не работает, я предполагаю, что я делаю что-то не так.

Итак, я также нуждаюсь в том, чтобы запрос выбирал данные для пользователя на основе идентификатора из acquisitions.supervisor_id и делает его доступным как supervisor_first_name и supervisor_last_name.

+0

Вы пробовали использовать DB :: сырец() внутри оператора выбора. –

+0

Нет, я немного незнаю, как это реализовать в запросе, было бы признательно, если бы вы могли помочь мне в этом. Nortmally я бы просто сделал это с красноречивым, к сожалению, это невозможно из-за плагина. Благодаря! – Michael

ответ

0

Это должно быть что-то похожее;

return Datatable::query($query = DB::table('acquisitions') 
    ->where('acquisitions.deleted_at', '=', null) 
    ->where('acquisitions.status', '!=', 2) 
    ->join('contacts', 'acquisitions.contact_id', '=', 'contacts.id') 
    ->join('user', 'acquisitions.user_id', '=', 'user.id') 
      ->select(\DB::raw(" contacts.*, acquisitions.*, acquisitions.id as acquisitions_id, user.first_name as supervisor_first_name, user.last_name as supervisor_last_name, user.id as user_id ")) 
); 
+0

Спасибо, но это мне не помогает. Я знаю, как использовать необработанный запрос внутри select, однако я все же не знаю, как должен выглядеть правильный запрос, чтобы правильно присвоить значения:/ – Michael

+0

Помимо того факта, что я совершенно уверен, что мне нужно будет настроить сначала присоединитесь. – Michael

+0

Вы не можете использовать псевдонимы в запросе, если это то, чего вы пытаетесь достичь. Что вы можете сделать, так это сделать запрос sub и использовать вывод в инструкции where. Можете ли вы предоставить более подробную информацию о проблеме, поскольку я не совсем понимаю точную проблему. –

1

Согласно вашему следующему последнему комментарию к другому ответу, вам необходимо подключиться самостоятельно к справочной таблице. Попробуйте это:

$result = DB::select('SELECT 
u.name user_first_name, 
u.last_name user_last_name, 
u.email user_email, 
s.name supervisor_name, 
s.last_name supervisor_last_name, 
s.email supervisor_email 
FROM acquisitions a 
JOIN users u ON a.user_id = u.id 
JOIN users s ON a.supervisor_id = s.id'); 

return $result; 

Обратите внимание, что $result является массивом StdClass объектов, а не сборником, но вы все еще можете перебирать его и вызвать значения текущего элемента:

foreach ($result as $item) { 
    print($item->supervisor_first_name); 
} 

Если вам нужен пункт WHERE , например чтобы получить строку конкретного пользователя из acquisitions, вы могли бы сделать, что при добавлении параметра в запрос следующим образом:

$result = DB::select('SELECT 
u.name user_first_name, 
u.last_name user_last_name, 
u.email user_email, 
s.name supervisor_name, 
s.last_name supervisor_last_name, 
s.email supervisor_email 
FROM acquisitions a 
JOIN users u ON a.user_id = u.id 
JOIN users s ON a.supervisor_id = s.id 
WHERE a.user_id = ? 
', [3]); 

EDIT

Если вам нужно ResultSet быть Collection, вы можете легко преобразовать массив в один, используя hydrate метод:

$userdata = \App\User::hydrate($result); // $userdata is now a collection of models 
+0

Большое спасибо, к сожалению, у меня теперь есть проблема с тем, что пакет не будет работать с ним, поскольку он, кажется, требует использования метода '__clone' коллекции '' __clone, вызываемого на не-объекте ' – Michael

+0

Убедитесь, что вы действительно получаете действительные результаты, и см. мое редактирование –

+0

Запрос действительно работает, но не возвращает именно то, что мне нужно. Теперь я получаю только данные, указанные ниже (в комментарии), но не хватает всех других значений из таблицы приобретений. Что касается преобразования в коллекцию, работает ли это, если данные не из конкретной таблицы? Я никогда не использовал эту функцию, я имею в виду, что в этом случае наборы данных должны быть фактически из таблицы приобретений и просто включать данные, которые выводит текущий запрос (который вы создали выше), я надеюсь, что вы знаете, что я имею в виду, я вполне устал уже. Большое спасибо за ваше время! – Michael

0
$devices = DB::table('devices as d') 
->leftJoin('users as au', 'd.assigned_user_id', '=', 'au.id') 
->leftJoin('users as cu', 'd.completed_by_user_id', '=', 'cu.id') 
->select('d.id','au.name as assigned_user_name','cu.name as completed_by_user_name'); 

также следить за этим ссылка

https://github.com/yajra/laravel-datatables/issues/161

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