Laravel-将过滤器传递给模型

时间:2019-01-28 03:58:08

标签: php laravel laravel-5 filter

我需要一些帮助。本质上,有两个表(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))'));

我应该改为更改模型吗?感谢您的帮助。

3 个答案:

答案 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;
  }