Условно добавить атрибут к модели в laravel - PullRequest
0 голосов
/ 18 ноября 2018

Можно ли добавить атрибут в мою модель при каждом вызове области видимости модели?

Например, в моем контроллере я хочу вызвать область видимости для добавления этих динамических атрибутов, например:

$Media_query = OutDoorMedia::query();
$Media_query->orderby('created_at', 'desc');
$Media_query->PreviouslyOrdered();
$Media = $Media_query->get();

И в моей модели я хочу сделать что-то вроде:

class OutDoorMedia extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'id',
        'user_id',
        'address',
        'location',
        'media_type',
    ];
}

class scopePreviouslyOrdered extends OutDoorMedia
{
public $appends = ['previously_ordered'];

public function getPreviouslyOrderedAttribute()
{
    if ($this->hasMany('App\Models\OutDoorMediaOrders', 'odm_id', 'id')->Where(function ($query) {
        $query->where('status', MEDIA_ORDER_CHECKOUT_STATUS)
            ->orWhere('status', STATUS_TO_PAY);
    })->exists()) {
        return true;
    } else {
        return false;
    }
}

}

Но это не работает, и я знаю, что это неправильно, Как этого добиться?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Я решил эту проблему с помощью @apokryfos, но с небольшим изменением.надеюсь, это уменьшит трату времени других.

Вместо того, чтобы добавлять атрибуты к модели, я добавил указанный атрибут к моей модели с помощью красноречивого магического метода:

$Media_query = OutDoorMedia::query();
$Media_query->orderby('created_at', 'desc');
$Media = $Media_query->get()->each(function ($items) {
          $items->append('previously_ordered');//add this attribute to all records which has the condition
         });    

В модели Как сказал апокриф, я применил эти два метода:

  public function PreviousOrders() {
      return $this->hasMany('App\Models\OutDoorMediaOrders', 'odm_id', 'id');
  }

  public function getPreviouslyOrderedAttribute() {
      return $this->PreviousOrders()->exists();
  }

Но мне этот метод не нужен, и мне пришлось удалить его из модели, потому что, если он существует в модели, он автоматически добавится к модели:

public $appends = [ 'previously_ordered' ];
0 голосов
/ 18 ноября 2018

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

Вот как вы могли бы добиться этого, используя отношения:

class OutDoorMedia extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'id',
        'user_id',
        'address',
        'location',
        'media_type',
    ];

    public function previousOrders() {
         return $this->hasMany('App\Models\OutDoorMediaOrders', 'odm_id', 'id');
    }
    public function getPreviouslyOrderedAttribute() {
        return $this->previousOrders()->exists(); 
    }
}

Тогда вы простоdo:

$Media_query = OutDoorMedia::whereHas('previousOrders')
                ->orderby('created_at', 'desc');

Если вы автоматически добавили динамический атрибут в модель, вы можете просто добавить в модель следующее:

 public $appends = [ 'previously_ordered' ];

Полагаю, если вы хотите получить лучшее от обоихМиры, которые вы можете сделать:

class OutdoorMediaWithPreviouslyOrdered extends OutDoorMedia {
     public $appends = [ 'previously_ordered' ];         
 }

Затем, когда вам понадобится модель дополнения, вы можете использовать:

 $Media_query = OutdoorMediaWithPreviouslyOrdered ::orderby('created_at', 'desc');
...