You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于with()的条件关系:交易表与车辆表关联查询需求

解决方案:获取所有交易记录(含关联车辆或无关联)

嘿,这问题我熟!咱们来一步步搞定它~ 需求是拿到所有交易记录,不管它是不是和车辆的买入/卖出有关联,同时还要结合with()的关联逻辑(我默认你指的是Laravel Eloquent的预加载方法哈,如果是原生SQL的WITH子句我也会补充方案)。

一、Laravel Eloquent 实现方案(用with()预加载关联)

首先得给模型定义好关联关系,因为一辆车的买入/卖出交易都对应transactions表的记录,所以在Transaction模型里要定义两个反向关联:

// app/Models/Transaction.php
class Transaction extends Model
{
    // 该交易作为买入记录对应的车辆
    public function boughtCar()
    {
        return $this->hasOne(Car::class, 'buy_transaction');
    }

    // 该交易作为卖出记录对应的车辆
    public function soldCar()
    {
        return $this->hasOne(Car::class, 'sell_transaction');
    }
}

然后,要获取所有交易记录,同时预加载对应的车辆信息(如果有的话),直接用with()方法即可:

// 获取所有交易,关联对应的买入/卖出车辆(无关联则为null)
$allTransactions = Transaction::with(['boughtCar', 'soldCar'])->get();

这样返回的结果里:

  • 如果某条交易是某辆车的买入记录,boughtCar字段会包含对应车辆的信息
  • 如果是卖出记录,soldCar字段会有数据
  • 如果和车辆完全无关,这两个字段就是null,但交易记录本身会被保留(这正是我们要的)

二、原生SQL 实现方案(结合WITH子句)

如果不用框架,直接写SQL的话,我们可以用WITH子句先整理车辆的交易关联,再通过LEFT JOIN保留所有交易记录:

WITH car_transaction_links AS (
    SELECT
        id AS car_id,
        plate,
        specs,
        buy_transaction,
        sell_transaction
    FROM cars
)
SELECT
    t.*,
    -- 买入车辆的信息(无则为null)
    ct_buy.car_id AS bought_car_id,
    ct_buy.plate AS bought_car_plate,
    ct_buy.specs AS bought_car_specs,
    -- 卖出车辆的信息(无则为null)
    ct_sell.car_id AS sold_car_id,
    ct_sell.plate AS sold_car_plate,
    ct_sell.specs AS sold_car_specs
FROM transactions t
-- 左关联买入交易的车辆
LEFT JOIN car_transaction_links ct_buy ON t.id = ct_buy.buy_transaction
-- 左关联卖出交易的车辆
LEFT JOIN car_transaction_links ct_sell ON t.id = ct_sell.sell_transaction
-- 可选:按交易日期排序
ORDER BY t.date DESC;

这里用WITH子句把车辆的交易关联信息先提取出来,再两次左关联到交易表,这样所有交易都会被返回,关联的车辆信息存在就显示,不存在则为null。


内容的提问来源于stack exchange,提问作者tinyCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:51:12