Php объединить результаты двух разных запросов и удалить дубликаты - PullRequest
1 голос
/ 02 февраля 2020

У меня есть две mysql таблицы. Первая таблица theme_images содержит изображения по умолчанию для данной темы. Вторая таблица custom_theme_images содержит пользовательские изображения, которые пользователь загружает для переопределения данного изображения по умолчанию в таблице тем.

Две таблицы связаны между собой с помощью поля them_image_id в custom_theme_images. Кроме того, каждый пользователь идентифицируется уникальным user_business_id , поскольку разные пользователи могут переопределить одно и то же изображение в своем профиле, если они используют одну и ту же тему. Структура выглядит следующим образом:

Theme_images table

custom_theme_images table

Все, что я хочу, это иметь возможность отображать все записи в таблице theme_images с изображениями по умолчанию, но если данный пользователь переопределил изображение в таблице custom_theme_image , то вместо изображения по умолчанию должно отображаться пользовательское изображение.

Что я пробовал

Я пробовал внутренние, левые и правые соединения, но они возвращают только те поля, которые соответствуют только в обеих таблицах, но я также хочу значения по умолчанию, если пользователь не переопределил изображение.

Затем я решил получить два разных результата из двух таблиц, и я пытаюсь объединить их и удалить дубликаты. Один результат содержит все пользовательские изображения данного профиля и темы, а второй содержит все значения по умолчанию. Код в Laravel стиле

Код

<tbody>
    @php
        $tally=1;
    @endphp
    @foreach($custom_theme_image as $custom_image)
        <tr>
            <td>{{$custom_image->theme_image_id}}</td>
            <td>{{$custom_image->theme_image->description ?? 'n/a'}}</td>
            <td>
                <img src="storage/{{$custom_image->image}}" class="w-100 " style="max-width: 75px;"/>
            </td>
            <td> <a href="/theme-images/{{$custom_image->theme_image_id}}/create"><span class="badge bg-primary mr-2">Update</span></a></td>
        </tr>
    @endforeach
    @foreach($theme_images as $theme_image)
        <tr>
            <td>{{$theme_image->id}}</td>
            <td>{{$theme_image->description ?? 'n/a'}}</td>
            <td>
                <img src="{{asset('previewThemes')}}/{{$theme_image->theme->name}}/{{$theme_image->image}}" class="w-100 " style="max-width: 75px;"/>
            </td>
            <td> <a href="/theme-images/{{$theme_image->id}}/create"><span class="badge bg-primary mr-2">Change</span></a></td>
        </tr>
        @php
            $tally=$tally+1;
        @endphp
    @endforeach
</tbody>

Результаты этих двух запросов определенно содержат дубликаты, то есть Results of the two queries

Два результата foreach: верхние результаты - это пользовательские изображения, нижние - результат изображения по умолчанию. Теперь все, что мне нужно, - это объединить эти дубликаты, чтобы показать пользовательские изображения, но при этом сохранить другие записи изображений по умолчанию ... Окончательные идентификаторы должны отображаться как 3,4,5,6,7 ... с 3,4,5 показ пользовательского изображения и 6,7 показ изображений по умолчанию

В этом случае:

user_business_id = 2 theme_id = 2

1 Ответ

1 голос
/ 02 февраля 2020

Предполагая, что я понял вашу проблему, есть гораздо более простое решение.

Теперь, допустим, вы выполнили два запроса и у вас есть две переменные, $themeImages и $themeImageOverrides. Поскольку вы используете Laravel, они оба будут коллекциями. Вы хотите взять коллекцию переопределений и ввести их по идентификатору изображения, например, так:

$themeImageOverrides = $themeImageOverrides->keyBy('theme_image_id');

Теперь, когда вы набрали oop - $themeImages, вы можете позвонить $themeImageOverrides->get($themeImage->id). Теперь этот метод get() фактически принимает второй аргумент, который является значением по умолчанию, которое будет использоваться, если значение для ключа не найдено, поэтому вы можете передать $themeImage. Это означает, что вы получите переопределение или исходное изображение. Поскольку оба они имеют атрибут image, это безопасно, так как вы можете просто сделать следующее:

$themeImageOverrides->get($themeImage->id, $themeImage)->image;

Надеюсь, что поможет.

...