Ошибка разбиения на страницы Laravel 8 — Столбец «is_deleted» в предложении where неоднозначен

#php #laravel #eloquent #laravel-8

Вопрос:

Я новичок в Laravel и наткнулся на проблему. Не могли бы вы посоветовать, как правильно это сделать, если я делаю это неправильно? Например, у меня есть 3 таблицы: product , product_category , product_image , как показано ниже.

 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;
 

Вопрос 1

Я разбиваю свои данные на страницы на интерфейсе, но я получаю следующую ошибку с приведенным ниже кодом.

Столбец «is_deleted» в предложении where неоднозначен.

 $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'));
 

Вопрос 2

У меня есть product_image таблица, и я хочу прикрепить изображения продуктов к каждому продукту в виде массива $product->images . В настоящее время я делаю следующее, это работает, но я не уверен, что это правильный путь. Может ли кто-нибудь, пожалуйста, посоветовать более чистый способ Laravel для этого?

 // 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;
}
 

Ответ №1:

Прежде всего

Переделайте свою миграцию и поместите

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

Во-вторых, попробуйте пересмотреть свои отношения между таблицами. Вы можете сделать то же самое с Красноречивым.

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

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

Пример запроса:

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

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

$products->paginate(15);
 

в клинке делают

 {{$products->links}} 
 

чтобы отобразить разбивку на страницы по умолчанию.

Комментарии:

1. Сначала сделайте это, а затем вам нужно будет переосмыслить, как добавлять изображения в продукты. Вы увидите, что это гораздо проще. Я понимаю, что вы новичок в Laravel, поэтому я рекомендую вам сначала взглянуть на «Красноречивые отношения Laravel» — поищите на YouTube, вы найдете много очень хорошо объясненных учебных пособий. Если вы поймете основы этого, вы начнете постепенно влюбляться в то, как все делается в Laravel.

2. Большое спасибо за вашу помощь, я решил свою проблему, используя ваш ответ.. например, $objData = Продукт::с(‘product_category’)->с(‘product_image’) Можете ли вы также, пожалуйста, посоветовать, как я могу ограничить количество возвращаемых параметров, например, если я хочу получить только столбцы названия категории продукта и идентификатора, только как я могу изменить выше для этого.

3. Чтобы получить только некоторые столбцы, вы можете::выбрать(«столбец»,»Другой столбец»)->с(«категория») и т. Д.

4. Но как мне получить его для таблиц «с», например, мне нужны только некоторые столбцы из таблицы категорий и полные столбцы для таблицы продуктов.. Заранее спасибо.

5. @amateur_coder — я отредактировал ответ выше. Посмотрите на отношение категорий к продукту и имейте в виду, что столбцы 1 и 2 должны быть из отношения: в вашем случае столбцы из категории.