Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据所选选项筛选查询_Mysql_Laravel - Fatal编程技术网

Mysql 根据所选选项筛选查询

Mysql 根据所选选项筛选查询,mysql,laravel,Mysql,Laravel,我正在尝试在我的应用程序中创建过滤器搜索,其中您有以下型号: 访客 属性响应 一个访问者可以有多个Attributeresponse用于保存详细信息,如姓名、姓氏、区域设置等 我正在努力实现的目标 如图所示,我希望检索具有Attributeresponse的访问者,其列名称为“name”,其值为“hector22”,同时列名称为“locale”,其值为“es” 换句话说,检索名为hector22、区域设置为es的访问者 这就是我目前在SQL中所拥有的: select * from

我正在尝试在我的应用程序中创建过滤器搜索,其中您有以下型号:

  • 访客
  • 属性响应
一个访问者可以有多个Attributeresponse用于保存详细信息,如姓名、姓氏、区域设置等

我正在努力实现的目标

如图所示,我希望检索具有Attributeresponse的访问者,其列名称为“name”,其值为“hector22”,同时列名称为“locale”,其值为“es”

换句话说,检索名为hector22、区域设置为es的访问者

这就是我目前在SQL中所拥有的:

select
  *
from
  `visitors`
where
  `bot_id` = '1255'
  and exists (
    select
      *
    from
      `attributeresponses`
    where
      `visitors`.`id` = `attributeresponses`.`visitor_id`
      and (
        `attributeresponses`.`attribute_name` = 'name'
        and `attributeresponses`.`value` = 'hector22'
      )
      and (
        `attributeresponses`.`attribute_name` = 'locale'
        and `attributeresponses`.`value` = 'es'
      )
  )
order by
  `visitors`.`id` desc
limit
  10 offset 0
这是在雄辩

            // retrieve visitors related to filters
            $visitors = Visitor::where('bot_id', $data['bot_id'] )
            // ->with(['properties' => function($topQuery) use ($data, $filters) {
            ->whereHas('properties', function($query) use ($filters, $data) {
                
            foreach( $filters as $key => $filter ){


                    $query->where(function($q) use ($filter) {
                                                        
                            $q->where('attributeresponses.attribute_name', $filter['property'] );

                            if($filter['operator'] == 1){
                                // IS equal
                                $q->where('attributeresponses.value', $filter['value'] );
                            }else if($filter['operator'] == 2){
                                // IS NOT equal
                                $q->where('attributeresponses.value', '!=', $filter['value']);                        
                            }else if($filter['operator'] == 3 && (is_numeric($filter['value'])) ){
                                // IS greater than
                                $q->where('attributeresponses.value', '>', $filter['value']);                        
                            }else if($filter['operator'] == 4 && (is_numeric($filter['value'])) ){
                                // IS less than
                                $q->where('attributeresponses.value', '<', $data['filters']['value']);                                                
                            }    
                        });


               


            }     
            })                        


            ->limit( 10 )
            ->offset( ( $data['paginate'] == 0 ? 0 : $data['paginate'] *10) )
            ->orderBy( 'visitors.id', 'desc' )
            ->get();     
//检索与筛选器相关的访问者
$visitors=Visitor::where('bot\u id',$data['bot\u id'])
//->with(['properties'=>函数($topQuery)use($data,$filters){
->whereHas('properties',function($query)use($filters,$data){
foreach($filters as$key=>$filter){
$query->where(函数($q)使用($filter){
$q->where('attributeresponses.attribute_name',$filter['property']);
if($filter['operator']==1){
//平等
$q->where('attributeresponses.value',$filter['value']);
}else if($filter['operator']==2){
//不平等
$q->where('attributeresponses.value','!=',$filter['value']);
}如果($filter['operator']==3&&(是数值($filter['value'])){
//大于
$q->where('attributeresponses.value','>',$filter['value']);
}else如果($filter['operator']==4&&(是数值($filter['value'])){
//少于

$q->where('attributeresponses.value',”您当前的查询将尝试获取同时具有名称
name
locale
属性的访问者,这是不可能的,相反,您可以
如下所示:

// retrieve visitors related to filters
$visitors = Visitor::where('bot_id', $data['bot_id'] )
    // ->with(['properties' => function($topQuery) use ($data, $filters) {
    ->whereHas('properties', function($query) use ($filters, $data) {   
        foreach( $filters as $key => $filter) {

            $query->orWhere(function($q) use ($filter) {                                            
                $q->where('attributeresponses.attribute_name', $filter['property'] );
                if($filter['operator'] == 1){
                    // IS equal
                    $q->where('attributeresponses.value', $filter['value'] );
                }else if($filter['operator'] == 2){
                    // IS NOT equal
                    $q->where('attributeresponses.value', '!=', $filter['value']);                        
                }else if($filter['operator'] == 3 && (is_numeric($filter['value'])) ){
                    // IS greater than
                    $q->where('attributeresponses.value', '>', $filter['value']);                        
                }else if($filter['operator'] == 4 && (is_numeric($filter['value'])) ){
                    // IS less than
                    $q->where('attributeresponses.value', '<', $data['filters']['value']);                                                
                }    
            });
        }    
    }, count($filters));                        


    ->limit( 10 )
    ->offset( ( $data['paginate'] == 0 ? 0 : $data['paginate'] *10) )
    ->orderBy( 'visitors.id', 'desc' )
    ->get();     
//检索与筛选器相关的访问者
$visitors=Visitor::where('bot\u id',$data['bot\u id'])
//->with(['properties'=>函数($topQuery)use($data,$filters){
->whereHas('properties',函数($query)使用($filters,$data){
foreach($filters as$key=>$filter){
$query->orWhere(函数($q)使用($filter){
$q->where('attributeresponses.attribute_name',$filter['property']);
if($filter['operator']==1){
//平等
$q->where('attributeresponses.value',$filter['value']);
}else if($filter['operator']==2){
//不平等
$q->where('attributeresponses.value','!=',$filter['value']);
}如果($filter['operator']==3&&(是数值($filter['value'])){
//大于
$q->where('attributeresponses.value','>',$filter['value']);
}else如果($filter['operator']==4&&(是数值($filter['value'])){
//少于
$q->where('attributeresponses.value','未经测试(显然),但只是需要考虑一下

select v.*
  from visitors v
  join attributeresponses r
    on r.visitor_id = v.id
where v.bot_id = 1255
   and (r.attribute_name,r.value) IN (('name','hector22'),('locale','es'))
Group 
    by v.id
having Count(distinct (r.attribute_name,r.value)) = 2
 order 
     by v.id desc
limit 10 
offset 0

谢谢!我感谢你的帮助,到目前为止它是有效的!我感谢你的帮助,如果我放置草莓提到的having条款,它似乎有效!