relatableQuery () для двух полей ресурсов в одной модели в Laravel Nova - PullRequest
1 голос
/ 04 июля 2019

У меня есть отношения между рабочими «днями» и проектами разных типов. Таким образом, моя запись «days» дважды ссылается на мою таблицу «projects», потому что у меня есть два разных типа проектов, называемых «Series» и «Event».

В моем ресурсе 'days' я создал два поля как таковых:

BelongsTo::make('Series','series',Project::class)->sortable()->nullable(),
BelongsTo::make('Event','event',Project::class)->sortable()->nullable(),

Я пытаюсь отфильтровать проекты по их типам, поэтому я создал это:

public static function relatableProjects(NovaRequest $request, $query){
    return $query->where('type', 'Series');
}

Я пытался создавать relatableSeries и relatableEvents, но они не работают. Как я могу правильно подключиться к полям, не создавая две отдельные таблицы для 'series' и 'events'.

Приведенный выше relatableQuery фильтрует оба поля ресурса.

1 Ответ

0 голосов
/ 06 июля 2019

Поскольку relatableQuery () ссылается на relatableModel () (так что relatableProjects () ссылается на модель проекта), я смог создать другую модель исключительно для того, чтобы помочь с этим.

Я создал модель событиякоторый ссылается на ту же таблицу projects и затем смог создать метод relatableEvents () для использования запроса фильтра where ().

Примечание: Мне также пришлось создать событиеРесурс, который ссылается на модель Event, поскольку именно так работает Nova, но смог скрыть ее от доступа. Более подробную информацию о можно найти здесь

См. пересмотренные поля BelongsTo и новую модель ниже:

Дневной ресурс

    /**
     * Build a "relatable" query for the given resource.
     *
     * This query determines which instances of the model may be attached to other resources.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public static function relatableProjects(NovaRequest $request, $query){
        return $query->where('type', 'Series');
    }

    /**
     * Build a "relatable" query for the given resource.
     *
     * This query determines which instances of the model may be attached to other resources.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public static function relatableEvents(NovaRequest $request, $query){
        return $query->where('type', 'Event');
    }

    /**
     * Get the fields displayed by the resource.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function fields(Request $request)
    {
        return [
            ID::make()->hideFromIndex()->hideFromDetail()->hideWhenUpdating(),
            BelongsTo::make('User','user',User::class)->sortable(),
            BelongsTo::make('Budget','budget',Budget::class)->sortable()->nullable(),
            BelongsTo::make('Series','series',Project::class)->sortable()->nullable(),
            BelongsTo::make('Event','event',Event::class)->sortable()->nullable(),
            DateTime::make('Last Updated','updated_at')->hideFromIndex()->readOnly(),
            new Panel('Schedule',$this->schedule()),
            new Panel('Time Entry',$this->timeEntries()),

        ];
    }

Модель события

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Event extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'projects';

    protected $casts = [
        'starts_on' => 'date',
        'ends_on' => 'date',
    ];

    public function event(){
        return $this->belongsTo('App\Event');
    }

    public function project(){
        return $this->belongsTo('App\Project');
    }
}
...