【问题标题】:Need to 'convert' an MySQL-query to Eloquent; where to start / how to think?需要将 MySQL 查询“转换”为 Eloquent;从哪里开始/如何思考?
【发布时间】:2016-07-30 19:13:43
【问题描述】:

我想将原始 SQL 查询“转换”为 Eloquent,这样我也可以附加预先加载的模型,所以我不必编辑我得到的一些模板。问题是,查询有一些子查询,我不知道如何将查询“转换”为 Eloquent 的格式。有问题的查询是:

SELECT
     e_eh.id,
     s.name as serie,
     s.id as serie_id,
     e_eh.season,
     e_eh.episode,
     e_eh.name,
     eh1.prog_trans,
     eh1.prog_check,
     eh1.prog_sync,
     eh1.avi
FROM (
    SELECT
        e.*
        , (
            SELECT
                eh.id
            FROM episode_histories AS eh
            WHERE 1
            AND eh.episode_id = e.id
            ORDER BY
                eh.id DESC
            LIMIT 1
        ) AS eh_id
    FROM episodes AS e
    WHERE 1
    AND e.completed = 0
    AND e.deleted_at IS NULL
) AS e_eh
INNER JOIN episode_histories AS eh1 ON e_eh.eh_id = eh1.id
INNER JOIN series as s ON s.id = e_eh.serie_id
ORDER BY prog_trans DESC, prog_check DESC, prog_sync DESC

我已经尝试了一些方法,但都没有奏效。我有点卡在如何将其“思考”到 Laravel / Eloquent 中。 Laravel 本身的文档也没有多大帮助。

简而言之: 我有两个模型,一个是情节,另一个是情节_历史,它存储了相关情节的一些历史记录。第三个模型是展示模型,它的相关展示。我需要一个带有相关节目模型的剧集(在我的模型中已经是一个关系)。但我还需要获取给定剧集的最新 episode_histories 模型。

我目前在我的模型中有什么:

剧集: `类情节扩展模型 { 使用软删除; 使用应用\历史; // 历史模型

protected $table        = 'episodes';
protected $primaryKey   = 'id';
public    $timestamps   = true;

/**
 * The attributes that should be mutated to dates.
 *
 * @var array
 */
protected $dates = ['deleted_at'];

/* Eloquent relations */
public function show() {
    return $this->belongsTo('App\Serie', 'serie_id', 'id');
}

public function history() {
    return $this->hasMany('App\History', 'episode_id', 'id')->orderBy('id', 'desc');
}

public static function getEpisodes2() {
    return DB::select();
}

} And my history model looks like this: class 历史扩展模型 { 使用软删除;

protected $table        = 'episode_histories';
protected $primaryKey   = 'id';
public    $timestamps   = true;

/**
 * The attributes that should be mutated to dates.
 *
 * @var array
 */
protected $dates = ['deleted_at'];

/* Eloquent relations */
public function episode() {
    return $this->belongsTo('App\Episode');
}

public function user() {
    return $this->belongsTo('App\User', 'user_id', 'id');
}

/* Custom functions */

}` 我希望有人可以帮助我解决这个问题。如果缺少信息,请告诉我,以便我补充。

【问题讨论】:

    标签: php laravel laravel-5 eloquent laravel-5.2


    【解决方案1】:

    如果您想执行此查询类型,我建议您使用Laravel Query Builder。看看文档

    【讨论】:

    • 如果查询生成器也可以返回相关模型(eager loading),那我肯定可以研究一下。
    【解决方案2】:

    处理复杂查询时最好的建议是保持原始。除此之外,您还有模型可以帮助您,因为当此查询发生更改时,需要进行大量编辑和重新洗牌以将其混合到完美状态。

    DB:statement("your query")
    

    如果你有程序,那么:

    DB::statement('CALL PROCEDURE_NAME(:id,@name,@email);',array($id);
    $result = DB:select('select @name as alias_name, @email as alias_name');
    

    【讨论】:

    • 那么,如果我理解正确,我可以更好地“运行”这个查询吗?嗯,希望 Eloquent 能帮到我,所以我不必编辑一些模板,这些模板依赖于 Eloquent 的一些关系。
    猜你喜欢
    • 2016-04-27
    • 1970-01-01
    • 2021-07-27
    • 2019-12-10
    • 2018-09-12
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多