php - Laravel Eloquent 地如何从集合中加载和获取单独数组中的关系

标签 php laravel mongodb eloquent php-mongodb

我在将父记录和子记录放在单独的数组中时遇到问题。 例如,我有 2 个模型:

1) Tournament (parent): Tournament有很多事件

 public function events(){

    return $this->hasMany(Event::class);
 }

2) Event (child): Events belong to a tournament

  public function tournament(){

      return $this->belongsTo(Tournament::class);
  }

我根据发送到 Controller 的请求中的参数过滤事件。过滤器是“away_team”、“home_team”、“tournament_id”。我过滤掉事件,然后尝试加载事件所属的锦标赛。

之后,我尝试获取锦标赛并将它们分别放入数组中。但它抛出内存允许错误。

我知道我可以增加 php.ini 中的内存,但我想以最好的方式参加锦标赛 - 最好是 Eloquent 查询 - 并减少内存使用。我已经在事件中有锦标赛,但问题是事件在一个集合中,所以我如何根据请求输入查询设法在单独的集合中获得事件和独特的锦标赛。

这是我到目前为止设法完成的代码。我知道它有效,但它会引发错误,因为我有 10,000 条或更多记录:

public functions filter(Request $request){

    $query = App\Model\Event::query();

        if ($request->has('away_team')) {
            $query = $query->where('away_team.name', 'like', '%' . $request->away_team . '%');
        }

        if ($request->has('home_team')) {
            $query = $query->where('home_team.name', 'like', '%' . $request->home_team . '%');
        }

        if ($request->has('tournament_id')) {
                $query = $query->where('tournament_id', new ObjectID($request->tournament_id));
        }

        //events collection with tournament
        $events = $query->with('tournament')->get();


        //here I get Allowed memory error
        $tournaments = [];
        foreach ($events as $event) {
            $tournaments[] = $event->tournament;
        }

        $tournaments = array_unique($tournaments);

}

那么,根据这些条件将这些模型记录放入单独的集合中的解决方案是什么:

1) 事件必须匹配 $request 过滤器

2) 比赛必须是唯一的并且属于DB赛事结果

PS: 我使用 PHP-mongo 和 Laravel eloquent for mongo db

PS2:我知道 mongo 不是关系型的,但你可以像某种关系一样使用它

任何帮助将不胜感激!提前致谢。

最佳答案

您可以将这些请求一分为二,但我不确定这是否会减少对内存的需求。

public functions filter(Request $request)
{

    $eventQuery = App\Model\Event::query();
    $tournamentQuery = App\Model\Tournament::query();

        if ($request->has('away_team')) {
            $eventQuery = $eventQuery->where('away_team.name', 'like', '%' . $request->away_team . '%');
        }

        if ($request->has('home_team')) {
            $eventQuery = $eventQuery->where('home_team.name', 'like', '%' . $request->home_team . '%');
        }

        if ($request->has('tournament_id')) {
                $eventQuery = $eventQuery->where('tournament_id', new ObjectID($request->tournament_id));
        }

        //events collection with tournament
        $events = $eventQuery->get();

        // Get only tournaments that belongs to selected events.
        $tournaments = $tournamentQuery->whereIn('id', $events->pluck('tournament_id')->all())->get()

}

顺便说一句,我认为,如果锦标赛拥有赛事,您应该在 Tournamentevent() 方法中调用 hasMany()而在 Event 类中则相反。

还可以为每个事件加载的锦标赛数量设置限制。只需像这样更改您的最后一个查询:

public function filter(Request $request)
{
    // ... your code

    $events = $query->with('tournament', function ($query) {
        $query->limit(10); 
    })->get();

   // ... rest of your code

}

关于php - Laravel Eloquent 地如何从集合中加载和获取单独数组中的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55990668/

相关文章:

php - 将 OS X 更新到 El Capitan 后的 Mcrypt 问题

php - 找不到 Laravel 5.1 PHP DOMDocument() 类

mongodb - 如何编写通用 ASP.NET Core ApiController 从客户端执行 MongoDB CRUD 操作?

php - 我可以在子文件夹中组织 Doctrine YAML 映射吗?

php - SQL 语法错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法

php - mysql - 在表 2 上删除特定行时在表 1 中插入行

php - 如何从 laravel 中的关系表中过滤数据

mongodb - 将数据移出 Hive 并移入 MongoDB 的最有效方法是什么?

javascript - Heroku 部署错误 : Cannot get Node App running after Deploy : Cannot find module '/app/web.js'

php - 如何在 ubuntu 18.04 上安装 pecl