Laravel Nova Override BelongsTo Поле языка на основе уже переведенных ресурсов - PullRequest
0 голосов
/ 09 января 2019

Представьте себе следующие 3 модели с полями:

Listing:
id

ListingTranslation:
id
listing_id
language_id
title

Language:
name
iso

Внутри моей ListingTranslation формы создания / обновления, как я могу отфильтровать селектор языка , чтобы НЕ ПОКАЗАТЬ языки, которые уже были переведены?

(т. Е. Если у меня есть 2 языка ES (id 1) и EN (id 2) и если у меня есть листинг с id 1, и в этом листинге уже есть перечисление list_translation с идентификатором 1, list_id 1 и language_id 1, селектором языка должен показывать только EN как опцию).

Выбор языка :

BelongsTo::make('Language')

Документация Laravel Nova предоставляет следующий метод для фильтрации запросов, используемых для заполнения меню выбора модели отношений:

    public static function relatableQuery(NovaRequest $request, $query)
    {
         return $query->where('user_id', $request->user()->id);
    }

Однако я не знаю, как получить доступ к чему-то вроде перечисления_идентификации из этого метода.

1 Ответ

0 голосов
/ 10 января 2019

Вместо создания ресурса Nova для сводной таблицы ListingTranslation вы можете использовать отношение BelongsToMany.

В Listing Новые поля ресурса добавить BelongsToMany::make('Languages'). Предполагая, что вы уже определили отношение в Listing модели.

В этот момент, когда вы присоединяете уже подключенный язык, вы увидите сообщение об ошибке The language is already attached

Но если вы все еще хотите прекратить перечислять уже подключенные языки, вы можете добавить relatableQuery, указанный ниже в разделе Listing nova resource.

public static function relatableLanguages(NovaRequest $request, $query)
{
    $listing = $request->findResourceOrFail();

    return $query->whereNotIn('id', $listing->languages->pluck('id'));
}

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

...