daager
@daager

Как вытащить модели связанные с софт-удаленной моделью?

В документации вроде ничего похожего не нашел, но почитывая форумы понимаю, что там много неявных моментов.
Есть модель Song, которая связана с моделью Playlist, а она с Artist, но это уже не важно.
Я могу сделать так Playlist::find(1)->songs и получить песни привязанные к тому плейлисту, но дошел до этапа удаления плейлиста и тут возникла проблема. Плейлист-то я софт-удалил, но песни не надо удалять, значит они остаются с привязкой к плейлисту, который удалили.
Вопрос:
Можно ли как-то вытащить все песни связанные с удаленными плейлистами, используя eloquent, а не sql?
Семантически, что-то типа этого Playlist::onlyTrashed()->songs
Спасибо.

Пока единственное решение

$songs=Song::join('playlists', 'songs.playlist_id','=','playlists.id')
				->where('playlists.deleted_at','!=','null')
				->orderBy('songs.playlist_id','asc')
				->orderBy('songs.position','asc')
				->get();

  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
Tesla
@Tesla
А в чем проблема? Вы получаете список удаленных плейлистов, потом перебираете привязанные песни.
$playlists = Playlist::onlyTrashed()->with('songs')->get();
foreach ($playlists as $playlist) {
	foreach ($playlist->songs as $song) {
		//
	}
}

Если необходимо получить только список песен, то не забывайте, что EloquentQueryBuilder::get() возвращает Collection.
pluck() и sortBy() вам в помощь.

Как вариант, вы можете получить список id удаленных плейлистов, а потом по этому списку выбрать песни:
$playlists = Playlist::onlyTrashed()->get()->pluck('id');
$songs = Song::whereIn('playlist_id', $playlists)->orderBy(...)->get();
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы