Skip to content
Advertisement

Laravel 8 pagination Error – Column ‘is_deleted’ in where clause is ambiguous

I am new to Laravel and have stumbled upon a problem. Would you mind advising the right way of doing it if I am doing it incorrectly? For example, I have 3 tables: product, product_category, product_image, as below.

CREATE TABLE `product` (
  `id` int(11) NOT NULL,
  `product_category_id` int(11) NOT NULL,
  `name` varchar(150) NOT NULL,
  `short_description` text DEFAULT NULL,
  `specification` text DEFAULT NULL,
  `size` text DEFAULT NULL,
  `is_deleted` char(1) NOT NULL DEFAULT 'n',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `product_category` (
  `id` int(11) NOT NULL,
  `name` varchar(150) NOT NULL,
  `description` text DEFAULT NULL,
  `image` varchar(150) DEFAULT NULL,
  `is_deleted` char(1) NOT NULL DEFAULT 'n',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `product_image` (
  `id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `image` varchar(150) NOT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Question 1

I am paginating my data on the frontend, but I am getting the following error with the below code.

Column ‘is_deleted’ in where clause is ambiguous.

$objData = DB::table('product')->join('product_category', 'product_category.id',
    'product.product_category_id')
    ->where($arrWhere)
    ->where(function ($query) {
        global $request;

        // If search sent
        if ($request->query('search')) {
            $query->orWhere('name', 'like', '%' . $request->query('search') . '%')
                ->orWhere('short_description', 'like', '%' . $request->query('search') . '%')
                ->orWhere('specification', 'like', '%' . $request->query('search') . '%')
                ->orWhere('size', 'like', '%' . $request->query('search') . '%');
        }
    })->orderBy($request->query('sortBy'), $strSortType)->select('product.*, product_category.*, 
        product.is_deleted as product_is_deleted, product_category.is_deleted as product_category_is_deleted')
    ->paginate($request->query('rowsPerPage'));

Question 2

I have a product_image table, and I want to attach the product images with each product as an array of $product->images. Currently, I am doing the below, it is working, but I am not sure it’s the right way. Can someone please advise a cleaner Laravel way of doing this?

// Get product_ids
$arrProductId = array();
foreach ($objData as $objProduct) {
    $arrProductId[] = $objProduct->id;
}

// Get product images
$arrProductImage = ProductImage::whereIn('product_id', $arrProductId)->get();

// Bind the product images to the rows to return
$arrRows = array();
foreach ($objData->items() as $objProduct) {

    $objProduct->images = array();

    foreach ($arrProductImage as $objProductImage) {
        if ($objProductImage->product_id == $objProduct->id) {
            $objProduct->images[] = $objProductImage->image;
        }
    }
    $arrRows[] = $objProduct;
}

Advertisement

Answer

First of all

Remake your migration and put

$table->boolean('is_deleted')->default(0);

Second of all, try and rething your relationship between tables. You can accomplish the same thing with Eloquent.

Class Product
{
    public function category(){
        return $this->belongsTo(Category::class)->select(['column1', 'column2']);
    }
}

Class Category
{
    public function products(){
    return $this->hasMany(Product::class);
}

Query example:

$products = Product::with('category')->where('some_field', $filter['field']);

if ($filter['someOtherField']) {
   $products->where('some_other_field', $filter['someOtherField']);
}

$products->paginate(15);

in blade do

{{$products->links}} 

to show the default pagination.

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement