我需要一些帮助。本质上,有两个表(tblplayers和tblmatches)。并非每个玩家都存在于tblmatches中。我的控制器有以下代码:
use App\Model\Players;
use App\Model\Matches;
use Illuminate\Support\Facades\DB;
class PlayersController extends Controller
{
public function index(Request $request) {
$players = Players::select('*');
我想更改上面的select语句,以便它只返回还存在于tblmatches中的玩家(其中tblmatches.P1_ID = tblplayers.ID)。
下面我在做什么错了?
$players = Players::addSelect(DB::raw('(SELECT * from tblmatches where (P1_ID = ID))'));
我应该改为更改模型吗?感谢您的帮助。
答案 0 :(得分:4)
将一对多关系(详细信息here)添加到您的玩家模型(可能还包括您的Matches模型)
public function matches()
{
return $this->hasMany('App\Model\Matches');
}
然后query通过
$players = Players::has('matches')->get();
答案 1 :(得分:1)
您绝对应该在两个表之间设置一个relationship。这样可以简化这种情况。
但是,您要找的实际上是WHERE EXISTS
。因此,类似以下内容的方法可以解决问题。
$players = Players::whereExists(function ($query) {
$query->select(DB::raw(1))
->from('tblmatches')
->whereRaw('tblmatches.player_id = tblplayers.id');
})
->get();
我假设您在whereRaw()
中有这两个字段,但是您应该相应地对其进行更改。
whereRaw('tblmatches.player_id = tblplayers.id');
但是,绝对要看一下关系:)
答案 2 :(得分:0)
检查此链接。 https://laravel.com/docs/5.7/queries
protected $table = 'tblplayers';
public function fetchPlayers ($data) {
$players = DB::table($this->table)
// you can filter it by Boolean expression using where
->where('status', '<>', 1)
// you can group by
->groupBy('status')
->get();
return $players;
}