2017-01-14 6 views
0

Принести весь продукт интернет-магазин по этому запросу, и я хочу использовать его в Laravel 5.3Как выполнить подзапрос с Laravel

Поскольку это Вложенный запрос, я не мог понять, это хорошо.

Как я могу использовать этот запрос с помощью функции Laravel:

SELECT 
     pe.entity_id AS eid, 
     tbl.attribute_id AS attr_id, 
     tbl.attribute_code AS attr_code, 
     tbl.`value` 
FROM tdshop_product_category AS pc 
INNER JOIN tdshop_product_entity AS pe ON (pc.product_id = pe.entity_id AND pe.deleted_at IS NULL) 
LEFT JOIN (
     SELECT 
      att.attribute_id, 
      att.attribute_code, 
      CASE att.backend_type 
      WHEN 'varchar' THEN pe_varchar.`value` 
      WHEN 'int' THEN pe_int.`value` 
      WHEN 'text' THEN pe_text.`value` 
      WHEN 'decimal' THEN pe_decimal.`value` 
      WHEN 'datetime' THEN pe_datetime.`value` 
      ELSE att.backend_type 
      END AS `value`, 
      CASE att.backend_type 
      WHEN 'varchar' THEN pe_varchar.`entity_id` 
      WHEN 'int' THEN pe_int.`entity_id` 
      WHEN 'text' THEN pe_text.`entity_id` 
      WHEN 'decimal' THEN pe_decimal.`entity_id` 
      WHEN 'datetime' THEN pe_datetime.`entity_id` 
      ELSE att.backend_type 
      END AS `entity_id` 
     FROM tdshop_entity_attribute AS ea 
     LEFT JOIN tdshop_attribute AS att ON (att.attribute_id = ea.attribute_id) 
     LEFT JOIN tdshop_product_entity_varchar AS pe_varchar ON (pe_varchar.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_int AS pe_int ON (pe_int.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_text AS pe_text ON (pe_text.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_decimal AS pe_decimal ON (pe_decimal.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_datetime AS pe_datetime ON (pe_datetime.attribute_id = att.attribute_id) 
) AS tbl ON (tbl.entity_id = pe.entity_id) 
GROUP BY pe.entity_id,tbl.attribute_id 
ORDER BY eid DESC 

Спасибо заранее.

ответ

1

Иногда вам может потребоваться использовать сырое выражение в запросе. Эти выражения будут введены в запрос как строки, поэтому будьте осторожны, чтобы не создавать точки ввода SQL! Чтобы создать сырое выражение, вы можете использовать DB :: необработанный метод:

DB::table('combinations') 
->select('combinations.id', DB::raw('GROUP_CONCAT(diseases.name ORDER BY diseases.id) AS DieasesName')) 
->join('diseases', function($join) { 
    $join->on(DB::raw('FIND_IN_SET(diseases.id, combinations.diseases_id)'), '>', 0); 
}) 

ИЛИ если вы хотите использовать DB::select быть осторожной инъекцией SQL .. использовать это как следующий пример:

$results = DB::select('select * from users where id = :id', ['id' => 1]); 

или

$results = DB::select('select * from users where id = ?', [1]); 

в вашем коде:

$sql = " 
SELECT 
     pe.entity_id AS eid, 
     tbl.attribute_id AS attr_id, 
     tbl.attribute_code AS attr_code, 
     tbl.`value` 
FROM tdshop_product_category AS pc 
INNER JOIN tdshop_product_entity AS pe ON (pc.product_id = pe.entity_id AND pe.deleted_at IS NULL) 
LEFT JOIN (
     SELECT 
      att.attribute_id, 
      att.attribute_code, 
      CASE att.backend_type 
      WHEN 'varchar' THEN pe_varchar.`value` 
      WHEN 'int' THEN pe_int.`value` 
      WHEN 'text' THEN pe_text.`value` 
      WHEN 'decimal' THEN pe_decimal.`value` 
      WHEN 'datetime' THEN pe_datetime.`value` 
      ELSE att.backend_type 
      END AS `value`, 
      CASE att.backend_type 
      WHEN 'varchar' THEN pe_varchar.`entity_id` 
      WHEN 'int' THEN pe_int.`entity_id` 
      WHEN 'text' THEN pe_text.`entity_id` 
      WHEN 'decimal' THEN pe_decimal.`entity_id` 
      WHEN 'datetime' THEN pe_datetime.`entity_id` 
      ELSE att.backend_type 
      END AS `entity_id` 
     FROM tdshop_entity_attribute AS ea 
     LEFT JOIN tdshop_attribute AS att ON (att.attribute_id = ea.attribute_id) 
     LEFT JOIN tdshop_product_entity_varchar AS pe_varchar ON (pe_varchar.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_int AS pe_int ON (pe_int.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_text AS pe_text ON (pe_text.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_decimal AS pe_decimal ON (pe_decimal.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_datetime AS pe_datetime ON (pe_datetime.attribute_id = att.attribute_id) 
) AS tbl ON (tbl.entity_id = pe.entity_id) 
GROUP BY pe.entity_id,tbl.attribute_id 
ORDER BY eid DESC 
"; 
$results = DB::select($sql); 
0

Если у вас есть сложный запрос, я предлагаю вам использовать метод DB::select.

DB::select("SELECT 
    pe.entity_id AS eid, 
     tbl.attribute_id AS attr_id, 
     tbl.attribute_code AS attr_code, 
     tbl.`value` 
    FROM tdshop_product_category AS pc 
    INNER JOIN tdshop_product_entity AS pe ON (pc.product_id = pe.entity_id AND pe.deleted_at IS NULL) 
    LEFT JOIN (
     SELECT 
       att.attribute_id, 
       att.attribute_code, 
      CASE att.backend_type 
       WHEN 'varchar' THEN pe_varchar.`value` 
       WHEN 'int' THEN pe_int.`value` 
       WHEN 'text' THEN pe_text.`value` 
       WHEN 'decimal' THEN pe_decimal.`value` 
       WHEN 'datetime' THEN pe_datetime.`value` 
       ELSE att.backend_type 
      END AS `value`, 
      CASE att.backend_type 
       WHEN 'varchar' THEN pe_varchar.`entity_id` 
       WHEN 'int' THEN pe_int.`entity_id` 
       WHEN 'text' THEN pe_text.`entity_id` 
       WHEN 'decimal' THEN pe_decimal.`entity_id` 
       WHEN 'datetime' THEN pe_datetime.`entity_id` 
       ELSE att.backend_type 
      END AS `entity_id` 
     FROM tdshop_entity_attribute AS ea 
     LEFT JOIN tdshop_attribute AS att ON (att.attribute_id = ea.attribute_id) 
     LEFT JOIN tdshop_product_entity_varchar AS pe_varchar ON (pe_varchar.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_int AS pe_int ON (pe_int.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_text AS pe_text ON (pe_text.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_decimal AS pe_decimal ON (pe_decimal.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_datetime AS pe_datetime ON (pe_datetime.attribute_id = att.attribute_id) 
    ) AS tbl ON (tbl.entity_id = pe.entity_id) 
    GROUP BY pe.entity_id,tbl.attribute_id 
    ORDER BY eid DESC"); 
1

Не можете проверить это, но это будет каким-то образом, как

$users = DB::table('tdshop_product_category') 
      ->join('tdshop_product_entity', 'pc.product_id' = 'pe.entity_id', 'pe.deleted_at' = NULL) 
      ->leftJoin(DB::raw("SELECT 
      att.attribute_id, 
      att.attribute_code, 
      CASE att.backend_type 
      WHEN `varchar` THEN pe_varchar.`value` 
      WHEN 'int' THEN pe_int.`value` 
      WHEN 'text' THEN pe_text.`value` 
      WHEN 'decimal' THEN pe_decimal.`value` 
      WHEN 'datetime' THEN pe_datetime.`value` 
      ELSE att.backend_type 
      END AS `value`, 
      CASE att.backend_type 
      WHEN 'varchar' THEN pe_varchar.`entity_id` 
      WHEN 'int' THEN pe_int.`entity_id` 
      WHEN 'text' THEN pe_text.`entity_id` 
      WHEN 'decimal' THEN pe_decimal.`entity_id` 
      WHEN 'datetime' THEN pe_datetime.`entity_id` 
      ELSE att.backend_type 
      END AS `entity_id` 
     FROM tdshop_entity_attribute AS ea 
     LEFT JOIN tdshop_attribute AS att ON (att.attribute_id = ea.attribute_id) 
     LEFT JOIN tdshop_product_entity_varchar AS pe_varchar ON (pe_varchar.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_int AS pe_int ON (pe_int.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_text AS pe_text ON (pe_text.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_decimal AS pe_decimal ON (pe_decimal.attribute_id = att.attribute_id) 
     LEFT JOIN tdshop_product_entity_datetime AS pe_datetime ON (pe_datetime.attribute_id = att.attribute_id) 
) tbl"), function($join){ 
    $join->on('tbl.entity_id', '=', 'pe.entity_id') 
})->groupBy('pe.entity_id,tbl.attribute_id')->orderBy('eid', 'DESC')->get(); 

или может нужно немного модифицировать.

+0

Спасибо. Я проверил код –

+0

@AliHesari удачи. –

Смежные вопросы