我的应用程序上安装了一个受欢迎的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)的软件包。在帮助下,我可以为此创建一个包...可能这会摇滚!
谢谢!