【问题标题】:Laravel Collection Filter doesn't return an Array as neededLaravel 集合过滤器不会根据需要返回数组
【发布时间】:2018-01-15 14:11:41
【问题描述】:

我正在构建一个 REST API,我需要根据未包含在 EventScores 表中的某个 EVENT 返回 TEAMS。 我遇到的问题在于过滤。如果 $teams 被“过滤器”修改,该方法返回如下内容:

{
"1": {
    "id": 6,
    "name": "sunt",
    "ath1": "Prof. Jarvis Rutherford",
    "ath2": "Joey Gutmann",
    "box": "ut",
    "category_id": 1,
    "totalScore": 6,
    "created_at": "2018-01-11 18:22:13",
    "updated_at": "2018-01-11 19:47:21"
}}

否则,它会返回一个 ARRAY,这是我需要在前端制作的东西。这是我需要的样本:

[
{
    "id": 5,
    "name": "eaque",
    "ath1": "Prof. Trever Grady",
    "ath2": "Angel Walsh",
    "box": "voluptatem",
    "category_id": 1,
    "totalScore": 15,
    "created_at": "2018-01-11 18:22:13",
    "updated_at": "2018-01-11 19:47:21"
}]

这就是方法:

public function eventTeams($category_id, $event_id)
{   
    $teams = Team::where('category_id', $category_id)->get();
    $eventScores = EventScores::where('event_id','=', $event_id)->get();
    $teams = $teams->filter(function($team) use($eventScores)
    {     
        if($eventScores->contains('team_id', $team->id)){
            return false;
        }else {
            return true;
        }

    });
    return response($teams, 200);
}

我试过这个:$teamsArr = $teams->toArray() 并返回 $teamsArr 但它不起作用。

【问题讨论】:

    标签: php arrays laravel rest collections


    【解决方案1】:

    尝试像这样查询数据抛出关系:

    class Team extends Model
    {
        public function eventScores()
        {
            return $this->hasMany('App\EventScores');
        }
    }
    
    class EventScores extends Model
    {
        public function team()
        {
            return $this->belongsTo('App\Team');
        }
    }
    
    class TestController extends Controller
    {
        public function index()
        {
            $eventId = 1;
            $categoryId = 1;
            $teams = Team::whereHas('eventScores', function ($query) use ($eventId) {
                $query->where('event_id', $eventId);
            })->where('category_id', $categoryId)
                ->get();
            return response()->json($teams);
        }
    }
    

    或者只使用 foreach 代替过滤器:

    $result = [];
    foreach ($teams as $team) {
        if ($team->category_id == $categoryId) {
            $result[] = $team;
        }
    }
    return response()->json($result);
    

    【讨论】:

    • 这成功了!我不得不使用whereDoesntHave 而不是whereHas 来获得我想要的东西,但这是要走的路!谢谢@IncOre
    【解决方案2】:

    当您说“它不起作用”时,您是什么意思?你收到错误了吗?

    你也可以这样做:

    public function eventTeams($categoryId, $eventId)
    {   
        $teams = Team::where('category_id', $categoryId)->get();
    
        $eventScoreTeamIds = EventScores::where('event_id', $eventId)
                ->get() // this will return a collection
                ->pluck('team_id') // get only the team_id
                ->all(); // get results as array
    
        $teams = $teams->filter(function($team) use($eventScoreTeamIds) {
            return in_array($team->id, $eventScoreTeamIds);     
        });
    
        return response($teams, 200);
    }
    

    【讨论】:

    • “不起作用”的意思是,如果 $teams 被过滤,它会返回一个格式为 {{"1": {"id": 6,"name": "sunt"}}} 的对象;否则,当过滤器为每个元素返回 true 时,最终变量 $teams 是一个类似 [{...},{...}] 的数组,这就是我需要得到的,以便在 JS 前端执行 forEach。
    【解决方案3】:

    您可以像这样使用array_values 方法:

    $teams = array_values(
        $teams->filter(function ($team) use ($eventScores) {
            return ! ($eventScores->contains('team_id', $team->id));
        })
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-18
      • 2013-10-08
      • 2020-07-05
      相关资源
      最近更新 更多