【问题标题】:Retrieves the latest data from a foreign key in a relation从关系中的外键检索最新数据
【发布时间】:2020-01-20 08:29:38
【问题描述】:

我想问一下,我可以检索关系中最后的外键数据吗?。

在这种情况下,我想检索最后一个用户交易数据。

例如在3个月前到现在的交易表中有一些交易数据如下。

{
    "current_page": 1,
    "data": [
        {
            "id": 8,
            "user_id": 1,
            "type": "sell",
            "created_at": "2019-12-11 11:55:31",
            "updated_at": "2019-12-11 11:55:31",
            "tax": null,
            "invoice_number": null,
            "name": "Fredy"
        },
        {
            "id": 7,
            "user_id": 1,
            "type": "buy",
            "created_at": "2019-11-20 17:14:55",
            "updated_at": "2019-11-20 17:14:55",
            "tax": null,
            "tax_percent": "0.90",
            "invoice_number": null,
            "name": "Fredy"
        },
        {
            "id": 6,
            "user_id": 8,
            "type": "buy",
            "created_at": "2019-11-20 16:28:33",
            "updated_at": "2019-11-20 16:28:33",
            "tax": null,
            "name": "Tommy"
        },
        {
            "id": 5,
            "user_id": 2,
            "type": "buy",
            "created_at": "2019-11-20 15:47:57",
            "updated_at": "2019-11-20 15:47:57",
            "tax": null,
            "name": "Sarah"
        },
        {
            "id": 4,
            "user_id": 3,
            "type": "buy",
            "created_at": "2019-11-20 15:47:31",
            "updated_at": "2019-11-20 15:47:31",
            "tax": null,
            "name": "John Doe"
        },
    ],
}

这是我制作的示例代码

public function index()
{
   $start = Carbon::now()->subMonths(3)->format('Y-m-d') . ' 00:00:00';
   $end = Carbon::now()->format('Y-m-d') . ' 23:59:59';

   return $query = DB::table('transaction')
                     ->join('users', 'users.id', '=', 'gold_transaction.user_id')
                     ->select('transaction.id', 'user_id', 'users.*')
                     ->whereBetween('transaction.created_at', [$start, $end])
                     ->whereIn('transaction.id', [DB::raw("SELECT MAX(transaction.id) FROM transaction GROUP BY user_id")])->get();
}

如果我只想为所有用户显示自上次交易起超过 7 天未进行交易的用户,我该怎么办?

谢谢。

【问题讨论】:

  • 那么您当前查询的错误是什么?
  • 我写的代码没有错。只是,我想检索用户数据,如果事务中有相同的外键,我只想检索最后一个外键数据并且没有相同的外键。然后调出不进行交易的用户,从交易的最后一条数据开始,直到 7 天以上。我可以在查询生成器中使用条件吗?还是有其他方法? @Qonvex620
  • 检查 stackoverflow.com/questions/1313120/… 并了解如何将这些查询之一转换为 eloquent/query builder。我知道它被标记为 MySQL,但其中许多查询都是纯 SQL,应该适用于 Postgres
  • 请检查我的答案。
  • @apokryfos 我会试试的。谢谢

标签: laravel postgresql eloquent


【解决方案1】:

然后你可以像下面那样做,

获取用户的交易

$transaction = User::with(['transactions' => function ($q) use($start, $end){
   $q->whereBetween('transactions.created_at', [$start, $end]);
])->find($user_id);

获取所有用户的交易

$transaction = User::with(['transactions' => function ($q) use($start, $end){
     $q->whereBetween('transactions.created_at', [$start, $end]);
])->get();

假设您的用户模型中有如下所示的交易关系

public function transactions() {
     return $this->hasMany('App\Transaction', 'user_id');
}

【讨论】:

  • 我尝试了上面的方法,但我没有得到我正在寻找的数据。我可以把所有进行交易的用户,从所有用户那里获取最新的交易数据,然后只显示超过 7 天没有交易的用户吗?
  • 没有超过7天的交易?因此,您将比较当前交易是否不大于 7 天与之前的交易?
  • 是的,没错,但我想做一个分组,我只记录这 3 个月内的最后一次用户交易,比较哪些用户超过 7 天没有进行交易并调用数据不超过 7 天的用户从用户进行的最后一次交易开始。我之前在 sql 命令中尝试过此操作 SELECT id, user_id FROM transaction WHERE id IN (SELECT MAX(id) FROM transaction GROUP BY user_id );
猜你喜欢
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
相关资源
最近更新 更多