2015-10-13 6 views
0

Итак, в этом приложении DrawingbelongsToCustomer. У меня есть DataTablelaravel datatable relationship

  <table id='drawing-table' class="table table-bordered table-hover"> 
       <thead> 
        <tr> 
         <th>Drawing number</th> 
         <th>Customer</th> 
        </tr> 
       </thead> 
      </table> 

который указывает $darwing->number и $customer->title. Для загрузки информации I use yajra\Datatables\Datatables;.

Данные загружаются с этим JS метод:

$(function() { 
    $('#drawing-table').DataTable({ 
     processing: true, 
     serverSide: true, 
     ajax: '{{route('drawings.datatable')}}', 
     columns: [ 
      { data: 'number', name: 'number' }, 
      { data: 'customer.title', name: 'customer' }, 
     ] 
    }); 
}); 

И этот метод Laravel:

public function datatable() 
{ 
    $drawings = Drawing::select(array('drawings.id','drawings.number')); 

    return Datatables::of(Drawing::with('customer')->select('*'))->make(true); 
} 

ВОПРОСЫ

  1. Как сделать DataTable поисковое окно для работы с $customer->title?
  2. Как отобразить номер чертежа и название клиента в качестве ссылки?

ответ

3
public function datatable() 
    { 

     //reference customer table 
     $drawings = DB::table('customers') 
      // join it with drawing table 
      ->join('drawings', 'drawings.customer_id', '=', 'customers.id') 
      //select columns for new virtual table. ID columns must be renamed, because they have the same title 
      ->select(['drawings.id AS drawing_id', 'drawings.number', 'customers.title', 'customers.id AS customer_id']); 

     // feed new virtual table to datatables and let it preform rest of the query (like, limit, skip, order etc.) 
     return Datatables::of($drawings) 
      ->editColumn('title', function($drawings) { 
       return '<a href="'.route('customers.show', $drawings->customer_id).'">' . $drawings->title . '</a>'; 
      }) 
      ->editColumn('number', function($drawings) { 
       return '<a href="'.route('drawings.show', $drawings->drawing_id).'">' . $drawings->number . '</a>'; 
      }) 
      ->make(true); 
    } 

Провел много часов, пытаясь понять это, надеясь, что это сэкономит кому-то время. http://datatables.yajrabox.com/fluent/joins

0

Я не уверен в вашем первом вопросе. Окно поиска Datatables будет искать все содержимое. Вы хотите сделать его конкретным только для 1 колонки?

Чтобы ответить на второй вопрос, вы можете отредактировать вывод столбца. Попробуйте

$drawings = Drawing::select(array('drawings.id','drawings.number')); 

return Datatables::of(Drawing::with('customer')->select('*')) 
     ->editColumn('customer', function($drawings) { 
      return '<a href="#">' . $drawings->customer . '</a>'; 
     })    
     ->make(true); 

Редактировать

Для достижения поиска, которые вы хотите, вы хотите сделать что-то вроде этого:

public function datatable(Request $request) 
{ 
    $drawings = Drawing::select(array('drawings.id','drawings.number')); 

    return Datatables::of(Drawing::with('customer')->select('*')) 
      ->filter(function ($query) use ($request) { 
       if ($request->has('name')) { 
        $query->where('customer.customer_name', 'like', "%{$request->get('name')}%"); 
       } 
      }) 
      ->editColumn('customer', function($drawings) { 
       return '<a href="#">' . $drawings->customer->customer_name . '</a>'; 
      })    
      ->make(true); 
} 

Тогда в вашем JS

$(function() { 
    $('#drawing-table').DataTable({ 
     processing: true, 
     serverSide: true, 
     ajax: { 
      url: '{{route('drawings.datatable')}}', 
      data: function (d) { 
       d.name = $('input[name=name]').val(); 
      } 
     }, 
     columns: [ 
      { data: 'number', name: 'number' }, 
      { data: 'customer.title', name: 'customer' }, 
     ] 
    }); 
}); 

Это не проверено, но должно достичь того, чего вы хотите.

+1

Он не будет искать клиента по имени, поскольку таблица чертежа имеет столбец customer_id, но заголовок клиента находится в таблице клиентов –

+0

Хорошо, я обновил сообщение. Если у вас есть реляционная модель с клиентской базой данных, где вы можете найти имя клиента, это будет работать. Просто обновите значения, как я уже догадался; Например, имя «customer_name». Пакет Larvel datatables имеет метод фильтрации, чтобы добавить ваши собственные фильтры. – IllegalPigeon

+0

Так что нет возможности использовать регулярное поле поиска, так как это приведет к тому, что 'Column not found: 1054 Unknown column 'customer' в 'where clause''? –