Laravel Nova relatable {Model} и findResourceOrFail () (недокументированное) - PullRequest
0 голосов
/ 07 июня 2019

Я бы хотел настроить взаимоотношения в Laravel Nova.

a Вопрос имеет n Альтернативы a Вопрос имеет 1 Ответ (что является альтернативой)

В моделях Laravel:

Вопрос :

public function alternatives()
{
    return $this->hasMany(Alternative::class);
}

public function answer()
{
    return $this->belongsTo(Alternative::class, 'answer_id', 'id');
}

Альтернатива :

public function question()
{
    return $this->belongsTo(Question::class);
}

public function isAnswerOf()
{
    return$this->hasOne(Question::class, 'answer_id');
}

Вопрос (Nova) :

public function fields(Request $request)
{
    return [
        ID::make()->sortable(),
        CKEditor::make('Wording', 'wording')->alwaysShow(),
        Boolean::make('Verified', 'is_verified'),
        Select::make('Type')->options([
            'multiple_choice' => 'Multiple Choice',
            'right_or_wrong' => 'Right or Wrong'
        ]),
        Tags::make('Nível')->type('level')->single(),
        Tags::make('Assuntos')->type('topic'),
        HasMany::make('Alternatives'),
        BelongsTo::make('Answer', 'answer', Alternative::class)->searchable()->nullable()
    ];
}

Альтернатива (Nova) :

    public function fields(Request $request)
{
    return [
        ID::make()->sortable(),
        Text::make('Text', 'letter'),
        CKEditor::make('Body', 'body'),
        BelongsTo::make('Question', 'question', Question::class),
        HasOne::make('IsAnswerOf', 'isAnswerOf', Question::class)
    ];
}

Существуют миллионы альтернатив.С BelongsTo::make('Answer', 'answer', Alternative::class)->searchable()->nullable() я бы хотел показать только ответы (альтернативы), которые являются альтернативами этого вопроса.Другими словами, я хочу, чтобы это поле было заполнено альтернативами, которые answer_id совпадают с заданным вопросом.

Я нашел в Google недокументированный 1 2 3 функция называется relatable {Query}, но я не могу получить желаемое поведение.

    public static function relatableAlternatives(NovaRequest $request, $query)
    {
       // $alternative = $request->findResourceOrFail(); (is failing)

       return $query->where('question_id', 'like', '219320');
    }

В relatable {Model} "Model" должна быть сама модель или псевдоним, который я дал в Novas Resource?(что является ответом)?

Если я жестко закодировал вопрос_ид, он работает.Как я могу получить вопрос_id?

...