Преобразование необработанного SQL-запроса в Laravel Eloquent - PullRequest
0 голосов
/ 31 октября 2018

Мой проект представляет собой систему управления контентом, и его новая версия будет интегрирована в среду Laravel; и есть много огромных SQL-запросов, которые необходимо преобразовать в красноречивый синтаксис.

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

Может ли кто-нибудь помочь мне преобразовать мои запросы или помочь мне найти инструмент, который мог бы выполнить эту работу?

Ниже приведен пример моих запросов (обратите внимание, что большинство моих запросов выглядят одинаково):

SELECT id, name, code,
       ( SELECT price FROM productprice WHERE id = p.id ) AS price,
       ( SELECT image FROM productpictures WHERE id = p.id LIMIT 1 ) 
AS image
FROM product p 
WHERE categoryid = 1

Спасибо.

Ответы [ 6 ]

0 голосов
/ 16 мая 2019
Update accesos set salida="2019-05-05 12:00:00" where salida = "0000-00-00 00:00:00" 
0 голосов
/ 31 октября 2018

Вы должны упомянуть псевдоним таблицы или имя таблицы в предложении where, иначе это приведет к нарушению целостности.

 DB::table('product as p')
                ->join('productprice', 'product.id', '=', 'productprice.id')
                ->join('productpictures','currencies.id','=','product.id ')
                ->select('p.id' ,'p.name' , 'p.code' , 'productprice.price', 
                  'productpictures.image as image')
                ->where('p.categoryid',1)
                ->get();
0 голосов
/ 31 октября 2018

На самом деле ваш SQL должен использовать соединения следующим образом:

SELECT 
p.id,
p.name,
p.code,
pprice.price,
ppictures.image
FROM product p
LEFT JOIN productprice pprice on p.id = pprice.id
LEFT JOIN productpictures ppictures on p.id = ppictures.id
WHERE p.categoryid = 1;

Вы можете прочитать больше здесь о левых соединениях.

Также, вероятно, не рекомендуется совмещать идентификаторы идентификаторов, было бы лучше иметь product_id на productpictures и productprices, и тогда у вас может быть ограничение внешнего ключа на это для таблицы products.

Но, увы, вопрос не в этом. Чтобы сделать это красноречивым, вы должны использовать Relations , а затем вы можете просто сделать что-то вроде этого:

$Product = Product::select('id', 'name', 'code')
->with('ProductPrice', 'ProductPictures')
->where('categoryid', 1)
->get();

и вы сможете вытащить это так:

$Product->id;
$Product->name;
$Product->code;
$Product->ProductPrice->price;
$Product->ProductPicture->image;
0 голосов
/ 31 октября 2018

Хи, попробуй так

  Model::select(
    'id', 
    'name', 
    'code', 
     DB::raw('( SELECT price FROM productprice WHERE id = p.id ) AS price,'),
     DB::raw('( SELECT image FROM productpictures WHERE id = p.id LIMIT 1 ) AS image')
    )   ->where('categoryid', 1);

Этот код создает ту же строку SQL на примере. Но я думаю, что это не лучший способ!

0 голосов
/ 31 октября 2018

используйте это

DB::table('product')
    ->select('id','name','code','productprice.price','productpictures.image')
    ->join('productprice','productprice.id' = 'product.id')
    ->join('image','productpictures.id' = 'product.id')
    ->where('product.categoryid',1);
    ->get();
0 голосов
/ 31 октября 2018

Это , на мой взгляд, лучший инструмент для чтения и изучения документации, потому что ни один инструмент не сможет сделать это автоматически для каждого случая.

Итак, вот моя попытка по вашему запросу выше:

DB::table('product as p')
   ->select([
       'id',
       'name',
       'code',
       'pp.price',
       'ppic.image'
   ])
   ->join('productprice as pp', 'pp.id', '=', 'p.id')
   ->join('productpictures as ppic', 'ppic.id', '=', 'p.id')
   ->where('categoryid', 1)
   ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...