Laravel 过滤生成子查询

Laravel 过滤生成子查询,laravel,eloquent,subquery,filtering,Laravel,Eloquent,Subquery,Filtering,我在一个Laravel项目中,我正在尝试做一个过滤器: 我有以下表格:pubs,taps,pub_-taps(pub_-id,tap_-id) 我想通过存储在单独表(本例中为TAPS)中的一些特征(本例中为pub)来过滤一个项目(本例中为pub),这两个特征都与pub_TAPS相关 给了我一个选择的tapps id的数组,然后我想查询pub_tapps以知道满足条件的pub_id 例如,我尝试通过WIFI(tapp_id=5)和信用卡(tapp_id=16)进行过滤。如果我们严格要求,结果必须是

我在一个Laravel项目中,我正在尝试做一个过滤器:

我有以下表格:pubs,taps,pub_-taps(pub_-id,tap_-id)

我想通过存储在单独表(本例中为TAPS)中的一些特征(本例中为pub)来过滤一个项目(本例中为pub),这两个特征都与pub_TAPS相关

给了我一个选择的tapps id的数组,然后我想查询pub_tapps以知道满足条件的pub_id

例如,我尝试通过WIFI(tapp_id=5)和信用卡(tapp_id=16)进行过滤。如果我们严格要求,结果必须是pub_id=57(tapp_id=5,8),如果不是pub_id=57和pub_id=16(tapp_id=5,7,8)

有这样做的想法吗?请注意,我正在使用不同的语义字段值进行过滤:S


非常感谢您的关注。

只要您选择了一系列TAPS$ID

选择满足您条件的TAPS

$tapIds = Tapps::whereIn('id',$ids)->where('condition',true)->pluck('id')->toArray();
然后在连接的表中获取pub的id

$pubIds = PubTapps::whereIn('tapp_id',$tapIds)->pluck('pub_id')->toArray();
然后去酒吧

$Pubs = Pubs::whereIn('id',$pubIds)->get();



到目前为止,您尝试了什么?您希望在提供
tapp\u id
后获得
pub\u id
?我希望在提供tapp\u id之后获得pub\u id,这是我尝试的,但它不会给我很好的结果公共函数pubsfilteredbyapps(filteredappspubsrequest$taps\u selected,PubTapp$PubTapp){$tapps_selected=is_string($tapps_selected)?分解(“,”,str_replace(“,”,$tapps_selected)):$tapps_selected;$pubs_tapps=PubTapp::其中('tapps_id',$tapps_selected)->get()->puck('pub_id');$pubs_selected=pub::其中('id',$pubs_-tapps)->get();返回$this->响应(PubProfileResource::collection($pubs_selected));}如果有人能帮我从这个{“tapps”:“5,8”}中获得[5,8],我想我可以做到,谢谢!!!!谢谢你的ansewr,但是你能解释一下吗:->where('condition',true)?我在测试你想要的条件时有一些错误,比如Sudent::where('gender','male')->get();你明白我的意思吗?@BerTsacianegudelTepuy喜欢$tapIds=Tapps::where('id',$ids)->where('WIFI',1)->pulk('id')->toArray();或者Tapps::where('id',$ids)->where('id',1)->where('CreditCard',1)->pulk pulk pock('id')->toArray();如果你想做像这样的不止一个条件,Tapps::where('id','id',$ids)->where('wififi 1)->where('CreditCard->toArray();你明白了吗?哦,谢谢,但我想用一个foreach来做这件事…我们如何插入这些->哪里('condition',true)?使用get/post请求Tapps::where('id','ids)->哪里('WIFI','request['WIFI'])->哪里('CreditCard','request['credit card'])->pull('id')->toArray();在我的Pub模型上是这样的:公共函数pubtaps(){return$this->belongtomany(Tapp::class,'Pub_-taps');}问题是它返回[],但当我在MySQL上测试时,结果不是这样,你知道它可能是什么吗?再次感谢!!非常感谢Claymore!!但是当数组有多个元素时仍然存在问题[5,16]也就是说,我有这样一个:公共函数PubsFilteredByApp(FilteredAppsPubsRequest$request){$tapps_Selected=$request->get('tapps');$tapps_Selected=is_string('tapps_Selected')分解(','str_替换('','','tapps_Selected'):$tapps_Selected);返回Pub::where('pubtaps('pubtaps',函数($query)使用('tapps_Selected){foreach($tapps_选择为$tappId){$query->where('tappId','like',$tappId);}})->get()}
class Pubbs extends Model
{
    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function tapps()
    {
        //All but the first argument here are optional so long as you follow Laravel naming conventions
        return $this->belongsToMany(Tapps::class, 'pub_tapps', 'pub_id', 'tapp_id', 'id', 'id');
    }
}
$tappIds = [5, 16];
$strictMode = true;
$pubs = app(App\Models\Pubbs::class)->whereHas('tapps', function (Illuminate\Database\Eloquent\Builder $query) use ($tappIds, $strictMode) {
    $tappKey = $query->getModel()->getKeyName();
    if (!$strictMode) {
        return $query->whereIn($tappKey, $tappIds);
    }
    foreach ($tappIds as $tappId) {
        $query->where($tappKey, $tappId)
    }
})->get();