Как автоматически отфильтровать чужую таблицу delete_at = null при использовании соединения в красноречии laravel?

На данный момент ->join() - это построитель запросов, поэтому он не будет использовать модель с SoftDelete, в моем проекте слишком много кодов, которые использовали соединение, поэтому я не хочу вручную заменять все это с нетерпеливой загрузкой ->with(), кто-нибудь знает, как это сделать, сохраняя соединение?

Например, я хочу получить такие данные, не добавляя ->where('tb_b.deleted_at', null) ко всем моим кодам:

$data = TabelA::join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')->get()
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Три альтернативы

  1. Добавление предложения WHERE после соединения
TabelA::query()
    ->join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
    ->whereNull('tb_b.deleted_at')
    ->get()
  1. Добавление предложения AND в соединение
TabelA::query()
    ->join(function ($join) {
        $join->on('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
            ->whereNull('tb_b.deleted_at');
    })
    ->get()
  1. Присоединение к подзапросу.
TabelA::query()
    ->joinSub(
        function ($sub) {
            $sub->from('tb_b')
                ->whereNull('tb_b.deleted_at');
        }),
        'tb_b_alias',
        'tb_b_alias.id_b',
        '=',
        'tb_a.id_b'
    )
    ->get()

Пожалуйста, проголосуйте за закрытие новых дубликатов вместо того, чтобы отвечать на них. Если вы найдете более ранний экземпляр того же вопроса, и он не содержит вашего лучшего совета, добавьте новый ответ на старую страницу. Когда вы отвечаете на повторяющиеся вопросы, Roomba не может выполнять свою важную работу.

mickmackusa 17.05.2023 05:53

Это возвышенный способ выразить это, но дубликаты чаще всего являются «похожими вопросами». Мне интересен Stack Overflow как сайт вопросов и ответов. Не более того.

IGP 18.05.2023 04:58

Если бы все люди разделяли вашу точку зрения и игнорировали возможности курировать/консолидировать контент, вы бы обнаружили, что ваши ценные идеи с меньшей вероятностью будут найдены людьми, которые действительно в них нуждаются (поскольку все новые вопросы уменьшат вероятность вашего найдены предыдущие посты). Ваш ответ выглядит так, как будто вы знаете, о чем говорите. Это заставляет меня задаться вопросом, сколько ваших материалов не было размещено в самом идеальном месте для максимального воздействия/досягаемости для исследователей, которые могли бы получить непосредственную пользу.

mickmackusa 18.05.2023 05:49
Ответ принят как подходящий

В основном есть два способа решить эту проблему

  1. Используя ограничение whereNull
$data = TabelA::join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
    ->whereNull('tb_b.deleted_at')
    ->get();
  1. Создание глобальной области в вашей модели (здесь я предполагаю модель TbB). Добавьте следующую функцию в класс модели, чтобы создать глобальную область для автоматической фильтрации метода получения модели.
public static function boot()
{
    parent::boot();

    static::addGlobalScope('notDeleted', function (Builder $builder) {
        $builder->where('deleted_at', null);
    });
}

Затем вы сделаете это, когда вам понадобятся ваши данные без удаленных данных.

$data = TabelA::withoutGlobalScope('notDeleted')
    ->join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
    ->get();

Подробнее о сфере применения Laravel читайте здесь: https://learn2torials.com/a/laravel8-global-model-scope

В частности, это ($foreign — массив имен внешних таблиц): public function scopeNotDeleted($query, $foreign){ $result = ''; foreach ($foreign as $key => $value){ $result .= $query->where($value.'deleted_at', null); } вернуть $результат }

Aditya Pratama 17.05.2023 05:28

А затем: $data = TabelA::join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')->notDeleted(['tb_b'])->get()

Aditya Pratama 17.05.2023 05:35

Другие вопросы по теме

Laravel 10x: запросы формы всегда возвращают сообщение об успешном завершении
Перенаправить зарегистрированного пользователя, если он перешел на страницу входа
Нпм ОШИБКА! путь \\wsl.localhost\Ubuntu-22.04\home\jdoe\DevProjects\litenotes\node_modules\.bin\autoprefixer
Мульти арендатор плюс складской фасад
Laravel Не удалось получить размер файла для файла в месте
Как исправить, что контроллер целевого класса не существует в Laravel? Он работает на другом контроллере, но не работает на этом конкретном контроллере
Использовать функцию многострочной стрелки в методе доступа в моделях laravel
Ошибка при загрузке ролей с разрешениями пользователей laravel
1452 — Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает в Laravel 10 — SQLSTATE [23000]: нарушение ограничения целостности
Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный '|', ожидание переменной (T_VARIABLE)