Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Merhaba kardeşler,

Büyük ihtimalle bilmiyor oluşumdan kaynaklanan şu işlemleri yapamadım.
Yapmak istediğim faturaları, 1 adet müşterisi ve çok adet Satırları ile birlikte veritabanından çekmek.

Invoices modelimde InvoiceLine modeline HasMany ilişkisi var.
Invoice modelimde Customer modeline BelongsTo ilişkisi var.

Teşekkürler.

//tüm faturaları "customer" ve "lines" bilgisi ile almak istiyorum.
$all_records = Invoice::with('customer','lines')->get();

//bu kayıtlar içerisinden customer_name alanı searchValue'ya benzer olan kayıtları istiyorum.
$records=$all_records->customer->where('customer_name','like', '%' . $searchValue . '%')
            ->orderBy($columnName, $columnSortOrder)
            ->skip($start)
            ->take($rowperpage)
            ->get();
            
// tüm kayıtların adetini alayım
        $totalRecords = $all_records->count();

//filtrelenmiş kayıtların adetini alayım
        $totalRecordswithFilter=$records->count();
  • mgsmus bunu yanıtladı.
  • ahmetbarut bunu beğendi.
  • yusufc

    use Illuminate\Database\Eloquent\Builder;
    
    // Bu alanın güvenliğini sağlamanız lazım. Dışarıdan kafalarına göre 
    // alan seçmelerine engel olmalısınız.
    $orderColumn = in_array($orderColumn, ['id', 'customer_name'])
        ? $orderColumn
        : 'id';
    
    // Bu alanın güvenliğini sağlamanız lazım. Dışarıdan kafalarına göre 
    // alan seçmelerine engel olmalısınız.
    $sortDirection = in_array($sortDirection, ['asc', 'desc'])
        ? $sortDirection
        : 'asc';
    
    $recordsCount = Invoice::count();
    
    $filteredRecords = Invoice::with([
            'customer', 
            'lines'
        ])
        ->whereHas('customer', function(Builder $query) use ($searchValue) {
            $query->where('customer_name', 'like', "%{$searchValue}%");
        })
        ->orderBy($orderColumn, $sortDirection)
        ->skip($start)
        ->take($rowPerPage)
        ->get();
    
    $filteredRecordsCount = $filteredRecords->count();

    Ayrıca neden kodları bir standarda göre yazmıyorsunuz anlamıyorum. Değişkenlerin bazısı snake_case bazısı camelCase bazısı hatalı vs. Böyle kod yazanları mülakatta eliyorum.

    yusufc

    use Illuminate\Database\Eloquent\Builder;
    
    // Bu alanın güvenliğini sağlamanız lazım. Dışarıdan kafalarına göre 
    // alan seçmelerine engel olmalısınız.
    $orderColumn = in_array($orderColumn, ['id', 'customer_name'])
        ? $orderColumn
        : 'id';
    
    // Bu alanın güvenliğini sağlamanız lazım. Dışarıdan kafalarına göre 
    // alan seçmelerine engel olmalısınız.
    $sortDirection = in_array($sortDirection, ['asc', 'desc'])
        ? $sortDirection
        : 'asc';
    
    $recordsCount = Invoice::count();
    
    $filteredRecords = Invoice::with([
            'customer', 
            'lines'
        ])
        ->whereHas('customer', function(Builder $query) use ($searchValue) {
            $query->where('customer_name', 'like', "%{$searchValue}%");
        })
        ->orderBy($orderColumn, $sortDirection)
        ->skip($start)
        ->take($rowPerPage)
        ->get();
    
    $filteredRecordsCount = $filteredRecords->count();

    Ayrıca neden kodları bir standarda göre yazmıyorsunuz anlamıyorum. Değişkenlerin bazısı snake_case bazısı camelCase bazısı hatalı vs. Böyle kod yazanları mülakatta eliyorum.

      mgsmus
      Kod okuma ve sorun çözme konusunda yeteneğinize hayranım 🙂
      Bir miktar değişiklik yaparak bu bölümü bitirmiş oldum.
      Bu kodu bir JS DataTables - Ajax örneğinden alarak değiştirmiştim.
      Dolayısı ile camelCase / snake_case karmaşası ondan idi.
      Tüm ortamlarda snake_case kullandığım için, Laravel'e geçince camelCase'e alışmak zor ancak amacım camelCase.
      Ama yine de DB tarafında snake_case'e devam etmek zorundayım sanırım.

      Netice itibarıyla kod şu şekilde biraz daha insan içine çıkar hale geldi 🙂
      Yeniden teşekkürler.

      public function getInvoices_dt(Request $request)
          {
              $draw = $request->get('draw');
              $start = $request->get("start");
              $rowPerPage = $request->get("length");
              $arrColumnIndex = $request->get('order');
              $arrColumnName = $request->get('columns');
              $arrOrder = $request->get('order');
              $arrSearch = $request->get('search');
              $columnIndex = $arrColumnIndex[0]['column'];
              $columnName = $arrColumnName[$columnIndex]['data'];
              $columnSortOrder = $arrOrder[0]['dir'];
              $searchValue = $arrSearch['value'];
      
              $columnName = in_array($columnName, ['customerName', 'description', 'issue_date', 'due_date'])
                  ? $columnName
                  : 'description';
      
              $columnSortOrder = in_array($columnSortOrder, ['asc', 'desc'])
                  ? $columnSortOrder
                  : 'asc';
      
              $totalRecords = Invoice::count();
      
              $records = Invoice::with([
                  'customer',
                  'lines'
              ])
                  ->whereHas('customer', function (Builder $query) use ($searchValue) {
                      $query->where('customer_name', 'like', "%{$searchValue}%");
                  })
                  ->orderBy($columnName, $columnSortOrder)
                  ->skip($start)
                  ->take($rowPerPage)
                  ->get();
      
              $totalRecordswithFilter = Invoice::with([
                  'customer',
                  'lines'
              ])
                  ->whereHas('customer', function (Builder $query) use ($searchValue) {
                      $query->where('customer_name', 'like', "%{$searchValue}%");
                  })->count();
      
      
              $arrData = array();
              $sNo = $start + 1;
              foreach ($records as $record) {
      
                  $id = $record->id;
                  $description = $record->description;
                  $issueDate = $record->issue_date;
                  $dueDate = $record->due_date;
                  $invoiceTotal= $random = mt_rand(10000, 99999);
      
                  $arrData[] = array(
                      "id" => $id,
                      "description" => $description,
                      "issue_date" => $issueDate,
                      "due_date" => $dueDate,
                      "invoiceTotal" => $invoiceTotal
                  );
              }
      
              $response = array(
                  "draw" => intval($draw),
                  "iTotalRecords" => $totalRecords,
                  "iTotalDisplayRecords" => $totalRecordswithFilter,
                  "aaData" => $arrData
              );
      
              echo json_encode($response);
              exit;
          }