Передайте переменную в глобальную область и определите, является ли вывод запроса нулевым Laravel

У меня есть модели перевода, и я хочу запустить глобальную область запроса, которая определяет текущую локаль и возвращает соответствующее значение или возвращается на английский, если перевод не существует в БД.

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

Как можно достичь такой вещи в Laravel?

мой код выглядит следующим образом:

trait WhereLanguage {

    /**
     * Boot the Where Language trait for a model.
     *
     * @return void
     */
   public static function bootWhereLanguage()
    {
        static::addGlobalScope(new WhereLanguageScope);
    }
}

и файл Scope:

class WhereLanguageScope implements ScopeInterface {


/**
 * Apply the scope to a given Eloquent query builder.
 *
 * @param  \Illuminate\Database\Eloquent\Builder $builder
 * @param  \Illuminate\Database\Eloquent\Model $model
 */
public function apply(Builder $builder, Model $model)
{
    $this->addWhereLang($builder);
}

/**
 * Remove the scope from the given Eloquent query builder.
 *
 * @param  \Illuminate\Database\Eloquent\Builder $builder
 * @param  \Illuminate\Database\Eloquent\Model $model
 *
 * @return void
 */
public function remove(Builder $builder, Model $model)
{
    $query = $builder->getQuery();
    foreach ((array) $query->wheres as $key => $where)
    {
        // If the where clause is a soft delete date constraint, we will remove it from
        // the query and reset the keys on the wheres. This allows this developer to
        // include deleted model in a relationship result set that is lazy loaded.
        if ($where['column'] == 'lang_id')
        {
            unset($query->wheres[$key]);
            $query->wheres = array_values($query->wheres);
        }
    }
}


/**
 * Extend Builder with custom method.
 *
 * @param \Illuminate\Database\Eloquent\Builder $builder
 *
 */
protected function addWhereLang(Builder $builder)
{
    $builder->macro('whereLang', function(Builder $builder)
    {

        // here 1 is ID for English,
        // 48 Arabic, 17 Netherlands...etc 
        // and It was the App:currentlocale() passed into Language model to determine the ID of current locale.
        // but for testing now I hard coded it with ID of 48
        $builder->where('lang_id','=','48');  
        return $builder;
    });
}

}

Пример использования:

$title = $centre->translations()->whereLang()->first()->name;

Где Center - это моя модель без локализации, а translation - это имя метода, который обрабатывает отношения между Center и CentreTranslation.

Кстати, я не хочу передавать переменную обязательно.

0 ответов

Другие вопросы по тегам