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

时间:2018-12-09 16:49:12

标签: php laravel eloquent

首先,我需要向您解释我要实现的目标。我试图将所有$categories返回到用于编辑图像的视图,以便可以将这些$categories放在选择元素中,但该图像位于顶部的$ category中。我尝试过几种不同的方法,每一种都给我带来很多麻烦。让我举一个例子。

我的主要问题是,我需要第一个选择元素成为图像的当前$ category,以便如果用户不选择其他元素,则图像的$ category不会改变。

这是我以前的尝试:

  1. 我进行了查询,获得了除带有$ image-> category_id的类别以外的所有类别。
  2. 然后,我进行了另一个查询,仅使我获得了带有$ image-> category_id的类别(我知道此查询几乎没有用,但我也需要该类别的名称)
  3. 我将该变量发送到视图
  4. 我在视图中使用了变量

我的代码是这样的(我剪切了一些与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个查询,以检查图像所属的类别和不属于该类别的类别。然后,我必须将变量的负载发送到视图,然后在视图中使用它们。我还需要检查这些变量是否存在,因为如果图像没有类别,我的代码就会变成干草堆之类的东西。

这就是为什么我一直想知道是否仅凭口才就能解决所有这些问题。是否可以这样做:

  1. 按降序获取所有类别。
  2. 然后在集合的开头放置一个具有特定ID的类别(这样它将是出现在选择框中的第一个元素),但在其之后仍然按照降序排列。

2 个答案:

答案 0 :(得分:2)

获取除由时间戳创建的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());

答案 1 :(得分:1)

尝试此代码。只有一个查询

 _, D_loss_curr, _ ,_, G_loss_curr= sess.run(
                [D_solver, D_loss, clip_D,G_solver, G_loss],
                feed_dict={X: X_mb, z: sample_z(mb_size, z_dim)}
            )

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