Laravel / Livewire: используйте withTrashed() для привязки маршрута модели для отображения удаленных записей

#laravel #eloquent #laravel-livewire

#laravel #красноречивый #laravel-livewire

Вопрос:

В списке я отображаю последнюю тему, включая те, которые удалены.

 function latest()
{
    return Topic::withTrashed()->latest();
}
 

Для отображения одной темы у меня есть компонент Livewire, в который передана эта тема.

 class ShowTopic extends Component
{
    public $topic;

    public function mount(Topic $topic)
    {
        $this->topic = $topic;
    }

    public function render()
    {
        return view('livewire.show-topic', [
            'topic' => $this->topic,
        ]);
    }
}
 

Но когда я перехожу к одной удаленной теме, она не отображается. Как я могу использовать withTrashed() привязки маршрута модели для отображения удаленных записей с помощью моего компонента Livewire?

Ответ №1:

Вы можете перезаписать resolveRouteBinding() метод в своей модели Eloquent и условно удалить SoftDeletingScope глобальную область видимости.

Здесь я использую политику для этой модели, чтобы проверить, могу ли я delete использовать модель — и если пользователь может удалить ее, он также может ее увидеть. Вы можете реализовать любую логику, которую хотите, или удалить глобальную область для всех запросов, если это больше подходит для вашего приложения.

 use IlluminateDatabaseEloquentSoftDeletingScope;

class Topic extends Model {
    // ...

    /**
    * Retrieve the model for a bound value.
    *
    * @param  mixed  $value
    * @param  string|null  $field
    * @return IlluminateDatabaseEloquentModel|null
    */
    public function resolveRouteBinding($value, $field = null)
    {
        // If no field was given, use the primary key
        if ($field === null) {
            $field = $this->getKey();
        }

        // Apply where clause
        $query = $this->where($field, $value);

        // Conditionally remove the softdelete scope to allow seeing soft-deleted records
        if (Auth::check() amp;amp; Auth::user()->can('delete', $this)) {
            $query->withoutGlobalScope(SoftDeletingScope::class);
        }

        // Find the first record, or abort
        return $query->firstOrFail();
    }
}