Laravel Mysql查询选择条件

时间:2016-12-08 21:37:08

标签: php mysql laravel laravel-5 phpunit

我有两张表如下:

1)。网址

    id    domain             created_at
------------------------------------------------
    1     google.com           2016-11-30 00:00:00
    2     test.com             2016-11-29 00:00:00
    3     example.com      2016-11-26 00:00:00

等。 2)。链接

     id  urls_id   end_date              created_at            status
---------------------------------------------------------------------------
     1     2       2016-11-30 00:00:00   2016-11-30 00:00:00     Approved
     2     2       2016-12-01 00:00:00   2016-11-30 00:00:00     Approved
     3     2       NULL                  2016-11-30 00:00:00     Approved
     4     2       2017-01-01 00:00:00   2016-12-01 00:00:00     Approved
     5     2       2016-01-01 00:00:00   2016-12-01 00:00:00     Pending
     6     3       2016-11-24 00:00:00   2016-12-01 00:00:00     Pending
     7     3       2016-01-01 00:00:00   2016-12-01 00:00:00     Approved
     8     3       NUll                  2016-12-02 00:00:00     Pending
     9     3       2016-01-08 00:00:00   2016-12-01 00:00:00     Approved
     10    3       NUll                  2016-12-02 00:00:00     Pending

我想编写一个MYSQL查询来返回这些条件: 每个域一行遵循以下条件:

1). end_date NOT NULL  AND
2). end_date > Carbon::now()   (I am using carbon) not expired AND
3). status is "Approved" AND
4). return latest end_date closer to present or now.

所以例如,它将查找并查找所有“urls_id”= 2并选择所有状态已批准并查找非NULL且未过期的end_date,但由于有一个Null然后它不会返回它,然后继续to“urls_id”= 3我们有2个已批准且都已过期且没有end_date NULL或未过期所以我们只会返回最新的end_date

这是一个输出

  id     domain          end_date_max        
  ------------------------------
  9      example.com     2016-01-08 00:00:00 

我们如何在一个SQL查询中执行此操作?在Laravel或只是简单的Raw查询

由于

1 个答案:

答案 0 :(得分:0)

Laravel提供了一个非常好的Active Record类,因此您可以在没有这样的原始查询的情况下执行此操作:

$result = DB::table('urls')
            ->leftJoin('links', 'urls.id', '=', 'links.urls_id')
            ->whereNotNull('links.end_date')
            ->where('links.end_date','>', Carbon::now())
            ->where('links.status','Approved')
            ->orderBy('links.end_date','DESC')
            ->groupBy('urls.domain')
            ->get();

这样的事情应该可以解决问题,我没有测试代码,所以我希望它有效。