PHP - 将参数从数组传递到 SQL 查询

标签 php mysql laravel

我有一个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();

最佳答案

似乎 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();

未测试

关于PHP - 将参数从数组传递到 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42301099/

相关文章:

laravel - php artisan 在 Azure 上迁移(在 BitBucket 管道中)

php - 错误消息,用于失败的注册,登录等。-使用$ GLOBAL oder $ _SESSION?

php - 7 fetch_assoc 一会儿 fetch_assoc

python - 无法在 OSX 中完成 mysql-python 安装

mysql - 嵌套评论的单一查询

php - Laravel 编写接口(interface)的最佳方式

php - 将网站上传到主机后,Codeigniter主机错误

php - rtf格式转pdf

mysql - 'posts' 和 'postmeta' WordPress 表的嵌套连接查询

php - Jwt token 是唯一的吗