首页 文章

使用Eloquent获取集合后,我可以更改该集合中单个对象的位置吗?

提问于
浏览
1

首先,我需要向您解释我正在努力实现的目标 . 我试图将所有 $categories 返回到用于编辑图像的视图,以便我可以将那些 $categories 放在选择元素中但是具有此图像属于顶部的$类别 . 我尝试过几种不同的方式,每次都给我带来了很多麻烦 . 让我给你举个例子 .

我的主要问题是我需要第一个select元素作为图像的当前$类别,这样如果用户没有选择不同的元素,图像的$类别就不会改变 .

这就是我以前的尝试:

  • 我做了一个查询,除了带有$ image-> category_id的类别之外,它都获得了所有类别 .

  • 然后我做了另一个查询,只获得了$ image-> category_id的类别(我知道这个查询几乎没用,但我也需要该类别的名称)

  • 我将这些变量发送到视图

  • 我在视图中使用了变量

我的代码是这样的(我已经删除了一些与isseu无关的代码):

public function updateArtwork($id){
    $image = Image::where('id', $id)->first();
    $imageCategoryId = $image->category_id;
    $categories = Category::where('id', '!=', $imageCategoryId)->orderBy('created_at', 'desc')->get();
    $imageCategory = Category::where('id', $imageCategoryId)->first();
    $imageCategoryName = $imageCategory->name;

    return view('updateArtwork', ['image' => $image, 'categories' => $categories, 'imageCategoryId' => $imageCategoryId, 'imageCategoryName' => $imageCategoryName]);
}

然后我在视图中使用它:

<div class="form-group">
    <label class='label required' for="artwork-category">Category</label>
    <select class='category-select' name='artwork-category' value='{{ Request::old('artwork-category') }}'>
            <option value='{{ $imageCategoryId }}'>{{ $imageCategoryName }}</option>
        @foreach($categories as $category)
            <option value='{{$category->id}}'>{{$category->name}}</option>
        @endforeach
    </select>
</div>

关于我是如何做到这一点的,我有很多问题 . 首先,我进行了2次查询,以检查图像所属的类别以及图像所属的类别 . 然后我必须向视图发送大量变量,然后在视图中使用它们 . 我还需要检查这些变量是否存在,因为如果图像没有类别,我的代码会变得乱七八糟 .

这就是为什么我一直想知道我是否可以用雄辩来解决所有这些问题 . 是否有可能做到这一点:

  • 按降序获取所有类别 .

  • 然后在集合的开头放置一个具有特定id的类别(这样它将成为第一个出现在选择框中的元素),但仍然按照降序排列 .

2 回答

  • 1

    获取除了在时间戳创建的desc排序的匹配id之外的所有项目,然后prepend该项目到集合:

    $collection = Category::where('id', '!=', $id)->orderByDesc('created_at')->get();
    $collection->prepend(Category::find($id);
    

    或者使用partition

    list($collection, $matched) = Category::orderByDesc('created_at')->get()->partition(function ($item) use ($id) {
        return $item->id !== $id;
    });
    $collection->prepend($matched->first());
    
  • 2

    试试这个代码 . 只有一个查询

    $categories = Category::orderBy('created_at', 'desc')->get();
    $categories = $categories->where('id', $imageCategoryId)->merge($categories)
    

    要么

    $categories->prepend($categories->where('id', $imageCategoryId)->first())->unique()
    

相关问题