【问题标题】:laravel 8 array sorting issuelaravel 8数组排序问题
【发布时间】:2021-01-21 14:21:36
【问题描述】:

这里我从 3 个模型横幅、横幅类型及其位置获取数据(横幅类型模型没有问题,所以我跳过它)[管理模板是从 quickadminpanel 生成的]

我的数据结构看起来像

横幅

Schema::create('banners', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('banner_name')->unique();
            $table->string('banner_header');
            $table->string('banner_caption')->nullable();
            $table->string('banner_btn_txt');
            $table->string('banner_btn_link');
            $table->string('banner_btn_color');
            $table->timestamps();
            $table->softDeletes();
        });

2021_01_15_000003_create_positions_table.php

Schema::create('positions', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('position');
            $table->timestamps();
        });

2021_01_15_000019_add_relationship_fields_to_positions_table.php

Schema::table('positions', function (Blueprint $table) {
            $table->unsignedBigInteger('banner_id')->nullable();
            $table->foreign('banner_id', 'banner_fk_2983258')->references('id')->on('banners');
        });
$banner = Banner::get();
$banner_types = BannerType::get();
$positions = Position::with(['banner'])->orderBy("position")->get();
$banner_array = array();
$banner_no_position = array();
foreach ($banner as $banner){
     if(Position::where('banner_id',$banner->id)->count() != 0){
            $banner_array = array($banner);
     }else{
            // print_r($banner);
            $banner_no_position = array($banner);
     }
}

我要做的是通过创建 2 个不同的数组来分离已定位和未定位的横幅 一个叫$banner_array 工作顺利,但另一个$banner_no_position 只是显示最后一个对象并丢弃其他对象

例如,我创建了 4 个横幅,我只定位了 2 个,然后我在 $banner_array 中得到 2 个对象,在 $banner_no_position 数组中只有 1 个对象,但它应该有 2 个或更多数组,因为我没有放置 2 个横幅

我的刀片看起来像https://pastebin.com/hwAqjZ7S,我的完整控制器看起来像https://pastebin.com/LvvLPSNP,有点乱,但我稍后会美化一些功能 我在控制器中使用的功能是 index 和 newPosition 来读取和保存数据

横幅模型看起来像https://pastebin.com/75nCdBvh 和位置模型看起来像https://pastebin.com/vr7GPd8A

【问题讨论】:

  • 如果您有从 Banner 到 Position 的关系,那么您可以使用 hasdoesntHave 将它们分开,或者您可以使用 withCount 然后在此基础上借助partition收集方法
  • 它的关系是从位置到横幅,即return $this->belongsTo(Banner::class, 'banner_id');

标签: php arrays laravel eloquent


【解决方案1】:

如果您有关系设置,您可以使用该关系来帮助解决此问题:

$banners = Banner::has('positions')->get();
$banners_without_positions = Banner::doesntHave('positions')->get();

这里我们使用查询来返回所有具有任何位置的横幅。然后我们正在执行另一个查询以返回所有没有任何位置的横幅。

或者您可以使用 withCount 方法获取每个横幅的关系计数,然后使用集合的 partition 方法将其分为 2 个不同的组:

[$banners, $banners_without] = Banner::withCount('positions')
    ->get()
    ->partition(fn ($i) => $i->positions_count);

这里我们说如果这个关系的计数是一个正数(真),那么把它分类到第一组,如果不是(没有位置)把它分类到第二组。您也可以通过急切加载positions (with('positions')) 然后计算关系$i->positions->count() 来做到这一点,但如果您不需要加载关系,则无需加载它并对模型进行水合。

根据需要调整事物的命名。

Laravel 8.x Docs - Eloquent - Relationships - Querying Relationship Existencehas

Laravel 8.x Docs - Eloquent - Relationships - Querying Relationship AbsencedoesntHave

Laravel 8.x Docs - Eloquent - Relationships - Counting Related ModelswithCount

Laravel 8.x Docs - Collections - Available Methodspartition

【讨论】:

  • 我更新了 qustion 并将模型添加到其中,但我会试试这个
猜你喜欢
  • 2011-09-27
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多