2017-02-17 70 views
1

我有一個SQL查詢,我想根據不同的場景傳遞不同的參數。我不知道如何做到這一點。這是查詢:PHP - 將參數從數組傳遞到SQL查詢

$data = Engagement::leftJoin('user_engagement', 'engagements.id', '=', 'user_engagement.engagement_id') 
      ->select('engagement_id', 'engagements.question', 'engagements.id') 
      ->selectRaw('count(*) as count') 
      ->whereBetween('user_engagement.created_at', [$from.' 00:00:00', $to.' 00:00:00']) 
      ->groupBy('user_engagement.engagement_id') 
      ->orderBy('count', 'DESC') 
      ->take(5) 
      ->get()->toArray(); 

所以,我想這樣做什麼,會是這個樣子:

  $model = new Engagement; 
      $leftJoin = ['user_engagement', 'engagements.id', '=', 'user_engagement.engagement_id']; 
      $select = ['engagement_id', 'engagements.question', 'engagements.id']; 
      $whereBetween = 'user_engagement.created_at'; 
      $groupBy = 'user_engagement.engagement_id'; 

      $data = $model->leftJoin($leftJoin) 
      ->select($select) 
      ->selectRaw('count(*) as count') 
      ->whereBetween($whereBetween, [$from.' 00:00:00', $to.' 00:00:00']) 
      ->groupBy($groupBy) 
      ->orderBy('count', 'DESC') 
      ->take(5) 
      ->get()->toArray(); 
+0

我想你可以在$ model對象上使用[call_user_func_array](http://php.net/manual/en/function.call-user-func-array.php)並且使用技巧 –

+0

保重sql注入.. – Fky

+0

我不能在模型對象上使用我調用未定義的方法Illuminate \ Database \ Query \ Builder :: call_user_func_array() ''' – Marco

回答

0

好像都leftJoinselect方法花費,而不是一個陣列的幾個參數的參數。此修復程序應該工作,但它不是推薦

$leftJoin = [ 
    'user_engagement', 
    'engagements.id', 
    '=', 
    'user_engagement.engagement_id' 
]; 
$select = [ 
'engagement_id', 
'engagements.question', 
'engagements.id' 
]; 

… 

data = $model->leftJoin($leftJoin[0], $leftJoin[1], $leftJoin[2], $leftJoin[3]) 
->select($select[0], $select[1], $select[2]) 
… 

我勸你分裂成數組變量單獨或創建用於此目的的對象。


你也可以去使用ReflectionMethod::invokeArgs

我猜的更先進的方式是,它看起來這樣:

$model = new Engagement; 
$leftJoin = ['user_engagement', 'engagements.id', '=', 'user_engagement.engagement_id']; 
$select = ['engagement_id', 'engagements.question', 'engagements.id']; 
$whereBetween = 'user_engagement.created_at'; 
$groupBy = 'user_engagement.engagement_id'; 

$reflectLeftJoin = new ReflectionMethod('Engagement', 'leftJoin'); 
$reflectSelect = new ReflectionMethod('Engagement', 'select'); 

$reflectSelect->invokeArgs($model, $reflectLeftJoin->invokeArgs($model, $leftJoin)) 
    ->selectRaw('count(*) as count') 
    ->whereBetween($whereBetween, [$from.' 00:00:00', $to.' 00:00:00']) 
    ->groupBy($groupBy) 
    ->orderBy('count', 'DESC') 
    ->take(5) 
    ->get()->toArray(); 

未測試

+0

檢查語法.. – Fky

+0

thx @Fky,固定 – Tymek

+0

這個解決方案的問題是,我會傳遞相同數量的參數的數組,並在我的情況下,數組將有不同的大小。 – Marco