вернутся только утвержденные столбцы для любых отношений - PullRequest
0 голосов
/ 15 января 2020

у меня есть таблицы продуктов.

мне нужно сделать что-то в модели, только вернуть продукт, где утверждено равно 1

это моя схема

Schema::create('products', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->text('description');
        $table->unsignedInteger('quantity');
        $table->unsignedInteger('subcategory_id')
        ->references('id')->on('subcategories')->onDelete('cascade');
        $table->decimal('price');
        $table->decimal('discount_price');
        $table->decimal('super_discount')->nullable();
        $table->string('cover');
        $table->unsignedInteger('brand_id')
        ->references('id')->on('brands')->onDelete('cascade');
        $table->unsignedInteger('category_id')
        ->references('id')->on('categories');
        $table->string('color');
        $table->string('size_id')->references('id')->on('sizes')->nullable();
        $table->decimal('rate');
        $table->enum('made_in',['turkey','china','egypt']);
        $table->string('serial');
        $table->boolean('approved')->default(0);
        $table->timestamps();
        $table->unique(['name','size_id','color']);
    });

я надеюсь это действителен.

1 Ответ

1 голос
/ 15 января 2020

Вы можете использовать Глобальные области действия

Глобальные области позволяют добавлять ограничения для всех запросов для данной модели. Собственная функция мягкого удаления Laravel использует глобальные области действия, чтобы извлекать только «не удаленные» модели из базы данных. Написание собственных глобальных областей может предоставить удобный и простой способ убедиться, что каждый запрос для данной модели получает определенные ограничения.

Написание глобальных областей Написание глобальной области просто. Определите класс, который реализует интерфейс Illuminate\Database\Eloquent\Scope. Этот интерфейс требует от вас реализации одного метода: применить. Метод apply может добавлять, где ограничения к запросу при необходимости:

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class ApprovedScope implements Scope
{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        return $builder->where('approved', 1);
    }
}

В приложении по умолчанию Laravel нет предопределенной папки для областей, поэтому не стесняйтесь собственная папка Scopes в каталоге приложения вашего приложения Laravel.

Применение глобальных областей Чтобы назначить глобальную область видимости модели, вы должны переопределить метод загрузки данной модели и использовать метод addGlobalScope:

<?php

namespace App;

use App\Scopes\ApprovedScope;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new ApprovedScope);
    }
}

После добавления области запрос к Product::all() выдаст следующие SQL:

select * from `products` where `approved` = 1

Документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...