На данный момент ->join() - это построитель запросов, поэтому он не будет использовать модель с SoftDelete, в моем проекте слишком много кодов, которые использовали соединение, поэтому я не хочу вручную заменять все это с нетерпеливой загрузкой ->with(), кто-нибудь знает, как это сделать, сохраняя соединение?
Например, я хочу получить такие данные, не добавляя ->where('tb_b.deleted_at', null) ко всем моим кодам:
$data = TabelA::join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')->get()






Три альтернативы
TabelA::query()
->join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
->whereNull('tb_b.deleted_at')
->get()
TabelA::query()
->join(function ($join) {
$join->on('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
->whereNull('tb_b.deleted_at');
})
->get()
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 не может выполнять свою важную работу.
С чем? Заботитесь о переполнении стека? Основная цель закрытия повторяющихся вопросов — помочь людям найти правильный ответ, собрав все эти ответы в одном месте.
Это возвышенный способ выразить это, но дубликаты чаще всего являются «похожими вопросами». Мне интересен Stack Overflow как сайт вопросов и ответов. Не более того.
Если бы все люди разделяли вашу точку зрения и игнорировали возможности курировать/консолидировать контент, вы бы обнаружили, что ваши ценные идеи с меньшей вероятностью будут найдены людьми, которые действительно в них нуждаются (поскольку все новые вопросы уменьшат вероятность вашего найдены предыдущие посты). Ваш ответ выглядит так, как будто вы знаете, о чем говорите. Это заставляет меня задаться вопросом, сколько ваших материалов не было размещено в самом идеальном месте для максимального воздействия/досягаемости для исследователей, которые могли бы получить непосредственную пользу.
В основном есть два способа решить эту проблему
$data = TabelA::join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')
->whereNull('tb_b.deleted_at')
->get();
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); } вернуть $результат }
А затем: $data = TabelA::join('tb_b', 'tb_a.id_b', '=', 'tb_b.id_b')->notDeleted(['tb_b'])->get()