Slim框架下Eloquent查询中间表tb_bet_fixture行数据问题
我来帮你搞定这个问题,分几个不同的方案,从最贴合Eloquent设计的用法到原生查询的修复,还有如何解决容器访问的问题:
方案1:用Eloquent关联直接获取中间表数据(推荐)
既然你已经在Bet模型里定义了belongsToMany关联并指定了withPivot('status'),完全不需要写原生SQL就能拿到指定投注的中间表数据,这也是Eloquent多对多关联的标准用法:
- 获取指定bet_id的所有中间表完整记录(包含bet_id、fixture_id、status):
// 找到ID为1的投注 $bet = Bet::find(1); // 提取关联的中间表pivot对象(每个对象包含status字段) $betFixtureRecords = $bet->fixtures->map(function ($fixture) { return $fixture->pivot; });
- 如果只需要status字段的列表,可以用更简洁的写法:
$statusList = $bet->fixtures->pluck('pivot.status');
- 想要更高效(避免加载整个Fixture模型),可以直接查询关联的中间表:
$betFixtureRecords = Bet::find(1)->fixtures() ->select('tb_bet_fixture.*') ->get();
方案2:修复原生查询的数据库连接问题
你遇到的「Database [default] not configured」错误,是因为默认的DB facade会使用default数据库连接,但你的项目用的是多连接配置,且模型指定的是client连接。解决方法很简单,在原生查询时显式指定连接即可:
use Illuminate\Database\Capsule\Manager as DB; // 显式指定使用'client'连接执行查询 $betFixtures = DB::connection('client') ->table('tb_bet_fixture') ->where('bet_id', 1) ->get();
方案3:在控制器中访问Middleware里的Capsule实例
如果你的$capsule是在Middleware中初始化的,想要在控制器中访问它,最规范的方式是把Capsule注册到Slim的依赖注入容器中:
- 在Middleware初始化Capsule后,将其绑定到容器:
// 假设$app是你的Slim应用实例 $container = $app->getContainer(); $container['db'] = function ($c) use ($capsule) { return $capsule; };
- 在控制器中通过容器获取Capsule并使用:
class BetController { protected $db; // 通过构造函数注入容器(或者直接注入db实例) public function __construct($container) { $this->db = $container->get('db'); } public function getBetFixtureStatuses($request, $response, $args) { // 使用指定的client连接执行查询 $betFixtures = $this->db->connection('client') ->table('tb_bet_fixture') ->where('bet_id', $args['bet_id']) ->get(); // 返回JSON响应 return $response->withJson($betFixtures); } }
内容的提问来源于stack exchange,提问作者Guilherme Ramalho
相关产品推荐
相关产品推荐

