简体   繁体   English

Laravel 5.1 Eloquent:如何根据某些条件检索集合?

[英]Laravel 5.1 Eloquent: How to retrieve a collection based on some conditions?

I need to filter a collection of projects based on some conditions. 我需要根据某些条件过滤项目集合。 Hear is the scenario. 听到是情景。

//This is part of projects table schema
  Schema::create('projects', function (Blueprint $table) {
           ...
            $table->smallInteger('source_lang_id')->index()->unsigned();
            $table->smallInteger('target_lang_id')->index()->unsigned();
           ...
        });
//This is part of translator_infos schema
Schema::create('translator_infos', function (Blueprint $table) {
          ....
            $table->smallInteger('from_l_1_id')->index()->unsigned();
            $table->smallInteger('from_l_2_id')->index()->nullable()->unsigned();
            $table->smallInteger('from_l_3_id')->index()->nullable()->unsigned();
            $table->smallInteger('from_l_4_id')->index()->nullable()->unsigned();
            $table->smallInteger('to_l_1_id')->index()->unsigned();
            $table->smallInteger('to_l_2_id')->index()->nullable()->unsigned();
            $table->smallInteger('to_l_3_id')->index()->nullable()->unsigned();
            $table->smallInteger('to_l_4_id')->index()->nullable()->unsigned();
        ....
        });

So each project has a source and target language. 因此,每个项目都有源语言和目标语言。 Translators may have 4 language pairs. 译者可能有4种语言对。 What I need is that to filter the collection of projects and find projects that their source and target language match at least one of the translator language pairs and pass this collection to the view. 我需要的是过滤项目集合,并找到其源语言和目标语言至少与翻译语言对之一匹配的项目,然后将此集合传递给视图。 For now the query I'm using is the following: 现在,我正在使用的查询如下:

$projects=Project::orderBy('created_at', 'desc')->where('status_id', "=", 1)->paginate(15);

How can I add this condition to the query? 如何将此条件添加到查询中? I tried using the following scope in my Project model but it is only appropriate for one pair of languages: 我尝试在Project模型中使用以下范围,但它仅适用于一对语言:

public function scopeLangMatch($query, $from, $to)
    {
        $match=[
            'source_lang_id'=>$from,
            'target_lang_id'=>$to
        ];
        return $query->where($match);
    }

Try rewriting your scope as follows: 尝试如下重写您的范围:

public function scopeLangMatch($query, $matches) {

    $useOr = false;
    foreach($matches as $from => $to){
        $match=['source_lang_id'=>$from, 'target_lang_id'=>$to];
        $query = ($useOr ? $query->orWhere($match) : $query->where($match));
        $useOr = true;
    }

    return $query;
}

Then you can use it as 然后您可以将其用作

Project::langMatch([
    1 => 2, 
    3 => 4, 
    5 => 6,
    7 => 8
])->get();

which also gives you the flexibility to define more or less matches in the future without having to modify your code or worry about param matching. 这也使您可以灵活地将来定义更多或更少的匹配项,而不必修改代码或担心参数匹配。

Thanks to @Hailwood suggestion I found the solution. 感谢@Hailwood的建议,我找到了解决方案。 I defined the following scope in the Project model: 我在项目模型中定义了以下范围:

public function scopeLangMatch($query, $from1,$from2,$from3,$from4, $to1, $to2, $to3, $to4)
    {
        $match=[
            'source_lang_id'=>$from1,
            'target_lang_id'=>$to1
        ];
        $match2=[
            'source_lang_id'=>$from2,
            'target_lang_id'=>$to2
        ];
        $match3=[
            'source_lang_id'=>$from3,
            'target_lang_id'=>$to3
        ];
        $match4=[
            'source_lang_id'=>$from4,
            'target_lang_id'=>$to4
        ];
        return $query->where($match)->orWhere($match2)->orWhere($match3)->orWhere($match4);
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM