从数据透视表中选择所有行

时间:2018-01-27 21:26:30

标签: php laravel eloquent slim

我在使用Slim Framework上的Eloquent选择数据透视表行时遇到了一些麻烦。我有以下关系:

tb_bet (id,...)
tb_fixture (id,...)
tb_bet_fixture (bet_id,fixture_id,status)

模型

Bet.php:

use \Illuminate\Database\Eloquent\Model;

class Bet extends Model {

    protected $connection = 'client';
    protected $table = 'tb_bet';
    public $timestamps = false;

    public function fixtures() {
        return $this->belongsToMany('Fixture')->withPivot('status');
    }
}

Fixture.php:

use \Illuminate\Database\Eloquent\Model;

    class Fixture extends Model {

        protected $connection = 'client';
        protected $table = 'tb_fixture';
        public $timestamps = false;

        public function bets() {
            return $this->belongsToMany('Bet')->withPivot('status');
        }
    }

我能够从投注中查询所有投注以及投注中的所有投注,但我真正需要的是这样做:select * from tb_bet_fixture where bet_id = 1。所以我有一个给定投注的所有夹具状态列表。有点像这样:

bet:{
  'id': 1,
  'pivot': [
      {bet_id: 1, fixture_id: 2, status: true},
      {bet_id: 1, fixture_id: 3, status: false},
      {bet_id: 1, fixture_id: 4, status: true}
  ]
}

我想过使用原始查询,但每当我尝试在我的控制器上声明use Illuminate\Database\Capsule\Manager as DB;并使用$users = DB::select('select * from tb_users');作为测试时,我会收到Database [default] not configured.错误,我无法知道如何访问包含当前连接的'$ capsule'变量(是的,我使用多个连接到不同的db)并在中间件上定义。无论如何,我很感激任何帮助。

1 个答案:

答案 0 :(得分:2)

选项1:创建模型

如果我使用枢轴作为模型。我会为数据透视表创建一个模型。这样你就可以直接查询表了。像这样。

use \Illuminate\Database\Eloquent\Model;
use App\Bet;

class BetFixture extends Model 
{
    protected $table =‘tb_bet_fixture’;

    public function bets() 
    {
        return $this->hasMany(Bet::class);
    }
} 

这会比查询更简单,更清晰,因为你正在直接从枢轴中选择

select * from tb_bet_fixture where bet_id = 1. 

选项2:选择使用灯具,具体投注

如果你想通过灯具选择具有特定投注的灯具,你可以这样查询。

Fixture::with(‘bets’ => function($query) use ($betId) {
    $query->where(‘tb_bet_fixture.bet_id,$betId);
});