【问题标题】:converting raw sql query to a laravel eloquent model将原始 sql 查询转换为 laravel 雄辩的模型
【发布时间】:2018-03-19 23:23:35
【问题描述】:

我一直在尝试将以下查询转换为雄辩的模型查询/原始数据库查询。我对 laravel 的了解有限,我已经停下来了。

 select 
                status, 
                (SELECT count(*) FROM active_call_statuses WHERE active_call_id = 'CA3a77245ab0eac10f8cf3aa8e7c8f9a91') AS total 
            from 
                active_call_statuses
            left JOIN
                active_calls ON active_calls.parent_call_id = active_call_statuses.active_call_id
            where 
                status IN('in-progress', 'completed', 'ringing', 'answered', 'busy', 'failed', 'no-answer')
            and 
                active_calls.parent_call_id = 'CA3a77245ab0eac10f8cf3aa8e7c8f9a91'

查询的目的是选择具有给定呼叫状态的所有列,并通过子查询中的 id 计算与当前呼叫关联的状态条目的总数。

据我所见,该查询在 mysql 中完成了它应该做的事情,但我不知道如何将其转换为雄辩的查询。

active_call_statuses 表和 active_calls 表分别通过 eloquent 中的 parent_call_id 上的一对多关系相互链接。

class ActiveCall extends Model

{
    /**
     * @var mixed
     */
    public $timestamps = false;

    /**
 * @var array fillable properties
 */
protected $fillable = ['user_id', 'conference_id', 'parent_call_id'];

/**
 * @return mixed
 */
public function statuses()
{
    return $this->belongsToMany('app\ActiveCallStatus');
}
}



  class ActiveCallStatus extends Model
{
/**
 * @var bool timestamps enabled
 */
public $timestamps = false;

/**
 * @var array fillable properties
 */
protected $fillable = ['active_call_id', 'user_id', 'status'];

/**
 * @return mixed
 */
public function activeCall()
{
    return $this->belongsTo('app\ActiveCall');
}
}

我尝试使用DB::raw 将查询包装在DB::select 中,通过将参数绑定到selectRaw aliased with :id 来使用DB->table(...)->selectRaw(...) .etc 方法调用表,但一切都导致数据库错误invalid parameter number 或其他错误。

这是我最后一次尝试:

processedUsers = DB::table('active_call_statuses')->select(
                    DB::raw("
                        SELECT
                        user_id,
                        status,
                        (SELECT count(*) FROM active_call_statuses WHERE active_call_id = :id) AS total 
                    FROM 
                        active_call_statuses"),
                    ['id' => $activeCall->parent_call_id])
                ->whereIn('status',"('in-progress', 'completed', 'ringing', 'answered', 'busy', 'failed', 'no-answer')")
                ->where("active_calls.parent_call_id", $activeCall->parent_call_id);

导致:

[2018-03-19 12:33:45] local.ERROR: Invalid argument supplied for foreach() {"exception":"[object] (ErrorException(code: 0): Invalid argument supplied for foreach() at C:\\wamp64\\www\\Stage\\LanthopusX\\voip\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Query\\Builder.php:763)

【问题讨论】:

  • 您在\DB 中使用的是原始 SQL 查询的包装器。 Eloquent 映射模型。它们不是一回事
  • 我知道,但我想做的是摆脱 \DB 并将其映射到 eloquent 模型。但现在查询根本不起作用。无论是使用\DB 还是将其转换为雄辩的模型都没关系,我希望它能够工作,最好是作为雄辩的模型。但如果它返回数据我很高兴

标签: laravel-5 eloquent


【解决方案1】:

试试这个:

ActiveCallStatus::leftJoin('active_calls', 'active_calls.parent_call_id', '=', 'active_call_statuses.active_call_id')
    ->whereIn('status', ['in-progress', 'completed', 'ringing', 'answered', 'busy', 'failed', 'no-answer'])
    ->where('active_calls.parent_call_id', $activeCall->parent_call_id)
    ->select('status')
    ->selectRaw('(SELECT count(*) FROM active_call_statuses WHERE active_call_id = ?) AS total', [$activeCall->parent_call_id])
    ->get();

【讨论】:

  • 非常感谢,我最终也注意到了我的代码中的错误,但是在盯着我在控制器中的 700 行代码一整天之后,我慢慢变得模糊了,所以我在这里错过了一些错误那里xD
猜你喜欢
  • 2017-01-05
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 2016-04-19
相关资源
最近更新 更多