#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 должны быть из отношения: в вашем случае столбцы из категории.