如何在Laravel 5.5中收集按日期分组的两个模型?

时间:2019-07-17 09:45:06

标签: laravel laravel-5

我有两个模型TourAdventure。我想按日期对旅行和冒险进行分组。并显示如下:

7月17日

游览1游览2游览3 冒险1冒险2冒险3

7月16日

游览1游览2游览3 冒险1冒险2冒险3

我知道如何对单个模型进行分组。它是这样的:

Tour::orderBy('created_at', 'desc')->take(20)->get()->groupBy(function($item)
          {
            return $item->created_at->format('d-M-y');
          });

如何合并两个模型并将它们显示为单个日期?当前代码天出现在不同的集合中。

编辑:包括表迁移。

public function up()
    {
        Schema::create('tours', function (Blueprint $table) {
          $table->increments('id');

          $table->string('name', 125);
          $table->string('slug')->index();
          $table->text('description')->nullable();
          $table->string('duration')->nullable();
          $table->string('url')->nullable();

          $table->boolean('ended')->default(false)->index();

          $table->timestamps();
        });
        DB::statement('ALTER TABLE tours ADD FULLTEXT search(name)');
    }

冒险模型的迁移与游览相同。这两个模型之间没有共享关系。

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找用于合并两个集合laravel.com/docs/5.8/collections#method-merge

的merge()方法
        //Get all Tours
        $tours= Tour::orderBy('created_at', 'desc')->get();

        //Get all adventures
        $adventures= Adventure::orderBy('created_at', 'desc')->get();

        //Merge both collection into 1 single collection and group according the date
        $dates= $tours->merge($adventures)->groupBy(function($item) {
            return $item->created_at->format('d-M-y');
        });

        return view('someView', compact('dates'));

然后您可以在日期内循环

        @foreach($dates as $date => $activity)
            <h2>{{$date}}</h2>
            <li>
                {{$activity}}
            </li>
        @endforeach

答案 1 :(得分:0)

类似这样的事情应该可以解决:

Tour::join('adventures', DB::raw('date(adventures.created_at)'), '=', DB::raw('date(tours.created_at)'))->get()

当然,在运行->get()之前,您仍然可以选择分组或排序等选项,因为->get()执行了查询并进行了收集:)