如何在数据表服务器端搜索其他查询

时间:2018-07-09 12:34:46

标签: php datatables server-side

我正在服务器端使用数据表,并且一切正常。现在,我试图搜索以获取从代码中的函数attrib()获得的数据。这会为每行添加更多信息,但问题是-无法搜索其数据。

这是可以理解的,因为它在用于搜索数据库的主要 $ sql查询中不存在。有办法解决吗?

我知道这可能很难理解,所以我正在尝试尽可能清楚。请提供更多说明,如果您可以提供帮助。谢谢。

$sql = "SELECT  mat_code,mat_descp,short_code_details,approverComment,date_created,
                mt.mat_type, mt.mat_desc,
                vc.val_class,vc.val_class_desc,
                vc.val_cat_code,vc.val_cat_desc,
                n.noun_name,n.qualifier,n.shorttext_item,
                u.uombs,
                mg.mtgp_id,mg.mtgp_desc,
                pt.plant_name,
                sl.sl_id,sl.sto_loc_name,
                pg.pur_id,pg.purchs_gp_name,
                us.fname,us.lname,mat_status
                    FROM mat_master_head mmh
                INNER JOIN material_type mt ON mmh.mat_type = mt.mat_type
                LEFT OUTER JOIN valuation_class vc ON mmh.val_class_id = vc.id
                INNER JOIN noun n ON mmh.noun_id = n.noun_id
                INNER JOIN uom_bs u ON mmh.uombs_id = u.uombs_id
                INNER JOIN material_group mg ON mmh.mg_id = mg.id
                INNER JOIN plant pt ON mmh.plant_id = pt.plant_id
                INNER JOIN storage_location sl ON mmh.sl_id = sl.id
                INNER JOIN purchase_gp  pg ON mmh.pur_id = pg.pur_id
                INNER JOIN users us ON mmh.user_id = us.id
                WHERE (1=1)";
                // AND mat_status = 4 AND (download_status = 0 OR download_status = 1)

if( !empty($requestData['search']['value']) ) {   // if there is a search parameter, $requestData['search']['value'] contains search parameter

    $sql.=" AND ( mat_code LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR plant_name LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR sto_loc_name LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR noun_name LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR qualifier LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR shorttext_item LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR short_code_details LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR uombs LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR mat_descp LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR fname LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR lname LIKE '%".$requestData['search']['value']."%' ";
    $sql.=" OR date_created LIKE '%".$requestData['search']['value']."%' )";

}

$query = $conn->query($sql);
$totalFiltered = $query->rowCount(); // when there is a search parameter then we have to modify total number filtered rows as per search result.

if( !empty($requestData['order'][0]['column']) || !empty($requestData['order'][0]['dir']) || !empty($requestData['start']) || !empty($requestData['length'])) {

$sql.=" ORDER BY ". $columns[$requestData['order'][0]['column']]."   

".$requestData['order'][0]['dir']." ";
    $sql.=" LIMIT ".$requestData['start']." , ".$requestData['length']." ";
    /* $requestData['order'][0]['column'] contains colmun index, $requestData['order'][0]['dir'] contains order such as asc/desc  */
    }

    $query = $conn->query($sql);


///Attribute Function//////////////////////////////////

    function attrib($mat_code)
    {
        global $conn;

    $mat_query = "SELECT a.attributes, mmd.attr_value, u.uombs FROM mat_master_details mmd
                    INNER JOIN attribute a ON mmd.attr_id = a.attr_id
                    INNER JOIN uom u ON a.uombs_id = u.uombs_id
                    WHERE mat_code = '$mat_code' AND mmd.attr_value >= '0'";
    $mat = $conn->query($mat_query);

    $attribs = '';

    foreach($mat as $mats){
        $attribs .= removeSlash($mats['attributes'].' - '.$mats['attr_value'].''.$mats['uombs'].' ');
    }
    return '<span class="colortxt3">'.$attribs.'</span>';
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

$data = array();
  foreach ($query as $row)  {  // preparing an array
    $nestedData=array(); //new array to display list

    $nestedData[0] =  $row['mat_code'];
    $nestedData[1] =  MatStatus($row['mat_status']);
    $nestedData[2] = '<span class="lgtxt">'.'PLANT:'.' '.'</span>'.'<span class="colortxt">'.$row['plant_name'].'</span>'.' '.
                     '<span class="lgtxt">'.'STORAGE LOCATION:'.' '.'</span>'.'<span class="colortxt">'.$row['sto_loc_name'].'</span>'.' '.'<br>'.

                     '<span class="lgtxt">'.'NOUN:'.' '.'</span>'.'<span class="colortxt">'.$row['noun_name'].'</span>'.' '.
                     '<span class="lgtxt">'.'QUALIFIER:'.' '.'</span>'.'<span class="colortxt">'.$row['qualifier'].'</span>'.' '.

                     '<span class="lgtxt">'.'SHORT TEXT:'.' '.'</span>'.'<span class="colortxt">'.$row['shorttext_item'].''.removeSlash($row['short_code_details']).'</span>'.' '.
                     '<span class="lgtxt">'.'BASE UOM:'.' '.'</span>'.'<span class="colortxt">'.$row['uombs'].'</span>'.' '.'<br>'.

                     '<span class="lgtxt">'.''.'</span>'.'<span class="colortxt4">'.$row['mat_descp'].'</span>'.' '.
                     '<span class="colortxt3">'.attrib($nestedData[0]).'</span>'.' '.'<br>'.
                     '<span class="lgtxt">'.'CREATED BY:'.' '.'</span>'.'<span class="colortxt2">'.$row['fname']." ". $row['lname'].'</span>'.' '.
                     '<span class="lgtxt">'.'DATE CREATED:'.' '.'</span>'.'<span class="colortxt2">'.$row['date_created'].'</span>';
    $nestedData[3] = '<a href="materialMasterForm.php?id='.$row['mat_code'].'" target="_blank" class="nbtn">View</a>';

    $data[] = $nestedData;
  }

1 个答案:

答案 0 :(得分:1)

您没有做到这一点。首先,“数据表”可能涉及几件事。只是带有数据的“表”,但我猜它是https://datatables.net

您的代码中有一个函数attrib(),但是它有什么作用?它的名字什么也没告诉我,上面的注释说:“属性函数”,这不是很有意义。好的,我知道它会执行查询。

因此,您在“数据表”中输出一列,该列的值来自查询,并且您希望能够在选择要显示的行之前搜索该值。

一个简单的解决方案是将attrib()的结果放在要搜索的表的列中。这可能违反了数据库规范化规则,但是同样它将是最快,最简单的解决方案。请记住,attrib()所依赖的任何值每次更改时都需要更新该列中的值。因此,这使得该解决方案相当难看。

另一种解决方案是将attrib()中的查询作为子查询合并到您的主搜索查询中。由于您的搜索查询已经非常复杂,因此最终可能会导致查询速度缓慢。但是,这是最好的解决方案。在最基本的形式下,它看起来像这样:

$sql .=" OR (SELECT ... FROM ... WHERE ....) LIKE '%".$requestData['search']['value']."%' ";

要了解有关子查询的更多信息,请参见:https://dev.mysql.com/doc/refman/8.0/en/subqueries.html

我敦促您编写更具可读性的代码。不要使用太多缩写,uombsmtgp是什么意思?您使用的是高级语言,因为这会使您的代码更易于理解,因此请不要破坏它。还要编写有用的注释,不要在代码中将它们用作分隔符。