Laravel Select CASE关系存在

时间:2016-01-12 12:05:31

标签: laravel laravel-5 eloquent laravel-5.1

我的应用程序上安装了一个受欢迎的fulltext search package,但现在我需要调整相关性列,如果存在某种关系的话。我的问题是我要检查的关系是非常复杂的,不可能用连接复制所以解决方案如下:

$results = MyModel::with('relation1', 'relation2')
                ->someComplexScopeRelation()
                ->distinct()
                ->search($string, $searchableColumns, true)
                ->orderBy('field', 'DESC')
                ->leftjoin('table2', function($q){
                    $q->on('table2.a','=','my_models.b');
                })
                ->select(array('field1','field2', DB:raw('CASE WHEN count(table2.id) > 0 THEN (relevance  + relevance * (count(table2.id) * 0.25)) ELSE relevance END AS relevance')))
                ->get();

是不可能的,因为与table2的关系包含与其他表的一些复杂条件。类似的东西:

public function table2Relationship()
{
    return $this->hasOne('Table2')
                ->where('field', 'value')
                ->where(function($q){
                    $q->where('field', 'value')
                        ->orWhere('field', 'value');
                })
                ->where('field', 'value')
                ->whereHas('AnotherRelation', function($q){
                    $q->where('field', 'value');
                })
                ->whereHas('AnotherRelation2', function($q){
                    $q->where('field', 'value')
                        ->where('field', 'value');
                })
                ->where(function($q){

                    if(CONDITION)
                        $q->where('field', 'value')
                            ->orWhere('field', 'value');
                    else
                        $q->where('field', 'value')
                            ->where(function($q){
                                $q->where('field', 'value')
                                    ->orWhere('field', 'value');
                            })
                });
}

我需要的是使用我的关系创建多个CASE,如果条件/关系存在那么我递增或递减列relevance的值,最初由上述包计算,并且没有声明关系的重复代码。< / p>

我需要类似的东西:

$results = MyModel::with('relation1', 'relation2')
                ->someComplexScopeRelation()
                ->distinct()
                ->search($string, $searchableColumns, true)
                ->orderBy('field', 'DESC')
                ->select(array('field1','field2'))
                ->addCaseSelect(function($q) {
                    $q->addCase(function($q) {
                                    $q->has('table2Relationship', function($q){
                                        $q->where('extra_conditions', 'value');
                                    }, '>=', 1);
                                }, 
                                DB::raw('(relevance + relevance * (count_table2Relationship * 0.25))'), //THEN
                                DB::raw('relevance') //ELSE
                        );
                    $q->addCase(function($q) {
                                    $q->has('table3Relationship', function($q){
                                        $q->where('extra_conditions', 'value');
                                    }, '=', 0);
                                }, 
                                DB::raw('relevance - 1'), //THEN
                                DB::raw('relevance') //ELSE
                        );
                }, DB::raw('relevance')) //AS
                ->get();

并且应该返回这样的内容:

SELECT field1, field2, 
(
    CASE 
        WHEN count(SELECT count(table2.id) FROM table2 WHERE ...) as count_table2Relationship >= 1 THEN (relevance + relevance * (count_table2Relationship * 0.5)) ELSE relevance 
        WHEN count(SELECT count(table3.id) FROM table3 WHERE ...) as count_table3Relationship = 0 THEN relevance - 1 ELSE relevance 
    END
) AS relevance FROM my_models WHERE ...

任何人都知道这个或一个满足我需求的包的解决方案吗?

经过几个小时的搜索后,我没有发现任何带有CASE条件(或IF / ELSE)的软件包。在帮助下,我可以为此创建一个包...可能这会摇滚!

谢谢!

0 个答案:

没有答案