【问题标题】:Convert Mysql Query to Laravel Eloquent将 Mysql 查询转换为 Laravel Eloquent
【发布时间】:2015-09-23 11:35:21
【问题描述】:

我在我的应用程序中使用 Laravel 5.1。

我的 MySQL 查询是

SELECT * FROM (SELECT uu.*,t.left_id AS meb_id,(CAST(t.pair AS UNSIGNED) - IFNULL(p.pair,0)) AS pair FROM (SELECT left_id,
(CASE 
WHEN ((SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000') >= (SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000')*2) 
THEN (SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000')
WHEN ((SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000') < (SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000')*2) 
THEN ((SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000') /2)
WHEN ((SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000') >= (SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000')*2)
THEN (SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000')
WHEN ((SELECT COUNT(meb_id) FROM user_count WHERE right_id=u.left_id AND active = 1 AND join_date <= '1442255400000') < (SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000')*2)
THEN ((SELECT COUNT(meb_id) FROM user_count WHERE left_id=u.left_id AND active = 1 AND join_date <= '1442255400000') / 2) END
) AS pair
FROM user_count AS u WHERE  left_id <> 0 GROUP BY left_id) AS t
LEFT JOIN users AS uu ON uu.`id` = t.left_id
LEFT JOIN `total_payment` p ON t.left_id = p.`meb_id`
WHERE t.pair <> 0) AS f WHERE f.pair > 0  AND f.active = 1

如何在 Laravel Eloquent 中转换它?我不知道如何在 laravel eloquent 中使用when case。

我的数据库架构是这样的

user_count 表

user 表

total_payment表

谁能帮帮我?

【问题讨论】:

  • 不确定我是否理解您为什么要使用 Eloquent 执行此操作,而不是使用带有 DB 外观的直接 SQL 查询。
  • @Pitchinnate 这个查询需要太多时间来执行,所以我认为如果我使用 eloquent 运行它会更好。
  • 那我想你不明白什么是雄辩。
  • Eloquent 不会加快您的数据库查询速度。如果有的话,它可能会增加时间,因为所有 ORMS 都有一些开销。在低 SQL 级别,Laravel 仍然向 MySQL 发送相同的查询(DBS 只了解 SQL 期间),仍然是相同的 SELECT、INSERT、UPDATE。 ORM 可以使代码更易读。您可以在代码中执行诸如 User::all() 之类的操作,然后可以访问诸如 User->name 之类的属性,而不是代码中的一堆冗长杂乱的查询和字符串连接。它真的是为了可读性和可移植性(没有特定的 sql = 可移植)。

标签: mysql laravel-5.1


【解决方案1】:

只需用 DB::statement("") 将原始查询括起来,如下所示:

DB::statement("INSERT INTO `mydatabase`.`mytable` (`id`, `created_at`, `updated_at`, `deleted_at`) VALUES ('7', '2015-09-26 13:38:48', '2015-09-26 13:43:41', NULL)");

它可以很好地完成工作,也可以处理种子。

【讨论】:

  • 我已经使用DB::statement("") 运行此查询。我想使用Eloquent 运行它
【解决方案2】:

Eloquent 是一个 ORM(对象关系映射),这意味着您可以将数据库映射到 PHP 对象(Eloquent 使用 Active Record 模式)。

它不是 DBAL,但是您仍然可以通过 DB Facade 执行 SQL 查询。

你提供的例子,用户表可以是Eloquent对象。

class User extends Model{
   /**
   * The table associated with the model.
   *
   * @var string
   */
  protected $table = 'user';
}

现在您可以获取所有用户行,例如:

$userCollection = (new User)->all(); //Fetch all rows

或者你可以通过PK找到一个,比如:

$user = (new User)->find(123); //123 is the PK of the User

【讨论】:

  • 我已经使用 DB Facade 运行了这个查询。但我想将此查询转换为 Laravel Eloquent。那么我该怎么做呢?我为每个表创建了模型。
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 2020-09-19
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 2020-10-03
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多