После использования Eloquent для получения коллекции можно ли изменить местоположение одного объекта в этой коллекции? - PullRequest
0 голосов
/ 09 декабря 2018

Сначала я должен объяснить вам, чего я пытаюсь достичь.Я пытаюсь вернуть все $categories в представление, которое используется для редактирования изображений, чтобы я мог поместить эти $categories в элемент выбора, НО имеет категорию $, к которой это изображение относится вверху.Я пытался сделать это несколькими разными способами, и каждый из них вызывает у меня довольно много головных болей.Позвольте мне привести пример.

Моя основная проблема заключается в том, что мне нужно, чтобы первый элемент select был текущей категорией $ изображения, чтобы, если пользователь не выбрал другой элемент, категория $изображение не изменится.

Вот как прошла моя предыдущая попытка:

  1. Я сделал запрос, который получает все категории, кроме той, которая имеет $ image-> category_id.
  2. Затем я сделал другой запрос, который возвращает мне только категорию с $ image-> category_id (я знаю, что этот запрос почти бесполезен, но мне также нужно было имя этой категории)
  3. Я отправляю эти переменныедля представления
  4. Я использовал переменные в представлении

Мой код был примерно таким (я вырезал некоторый код, который не имеет отношения к Иссеу):

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. Затем поместите категорию с определенным идентификатором в начале коллекции (чтобы это былопервый элемент, который должен появиться в поле выбора), но все еще следует в порядке убывания после него.

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Попробуйте этот код.Только один запрос

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

или

$categories->prepend($categories->where('id', $imageCategoryId)->first())->unique()
0 голосов
/ 09 декабря 2018

Получить все элементы, кроме соответствующего идентификатора, упорядоченного desc, созданным в метке времени, затем добавить элемент в коллекцию:

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

Или использовать раздел :

list($collection, $matched) = Category::orderByDesc('created_at')->get()->partition(function ($item) use ($id) {
    return $item->id !== $id;
});
$collection->prepend($matched->first());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...