2016-01-17 4 views
1

У меня есть функция с именем siblings, которая извлекает всех братьев и сестер пользователя.Добавление пользовательского атрибута eloquent в Laravel 5

select siblings(id) as `siblings` from users where id = 1 

я могу получить доступ к функции в красноречив, как

User::where('id', 1)->first([DB::raw(siblings(id) as `siblings`)]->siblings; 

Я хочу сделать доступный siblings с помощью пользовательского атрибута.

Я добавил siblings в $appends массив

Я также создал getSiblingsAttribute метод в моей User модели, как

public function getSiblingsAttribute() 
{ 
    if (!$this->exists()) { 
     return []; 
    } 

    $siblings = User::where('idd', $this->id) 
     ->first([DB::raw('siblings(id) AS `siblings`')]) 
     ->siblings; 

    return explode(',', $siblings); 
} 

Но это не работает, как $this->id возвращается null

Моя таблица схема users(id, username,...), так ясно id присутствует.

Есть ли способ, с помощью которого я могу связать функцию siblings во время запроса db, а затем возвратить что-то вроде $this->siblings от getSiblingsAttribute. Если я могу связать siblings(id) as siblings с запросом, выберите глобально, как и для областей с глобальным охватом.

Таким образом, мой код может быть просто

public function getSiblingsAttribute() 
{ 
    return $this->siblings; 
} 
+0

Он должен быть атрибутом '$ this-> ['id']'. – user2094178

ответ

0

Самый простой способ создать представление в базе данных и использовать его в виде таблицы:

protected $table = 'user_view'; 

В противном случае мне нужно больше информации о ваша проблема id == null. Если вы можете исправить это самостоятельно, на следующем шаге важно, чтобы вы использовали другое имя столбца, выбрав в своем аксессуре, иначе вы запускаете бесконечный цикл.

public function getSiblingsAttribute() 
{ 
    if (!$this->exists()) { 
     return []; 
    } 

    $siblings = User::where('id', $this->id) 
     ->first([DB::raw('siblings(id) AS `siblings_value`')]) 
     ->siblings_value; 

    return explode(',', $siblings); 
} 

EDIT

К сожалению, нет простого способа это АРХИВА. Но после немного возиться, я нашел (не очень приятное) решение. Попробуйте.

Вы должны добавить следующий класс и черту в свое приложение.

app/Classes/AdditionalColumnsTrait.php (дополнительный признак колонки)

namespace App\Classes; 


trait AdditionalColumnsTrait { 

    public function newEloquentBuilder($query) { 
     $builder = new EloquentBuilder($query); 
     $builder->additionalColumns = $this->getAdditionalColumns(); 

     return $builder; 
    } 

    protected function getAdditionalColumns() { 
     return []; 
    } 
} 

app/Classes/EloquentBuilder.php (расширенная EloquentBuilder)

namespace App\Classes; 

use Illuminate\Database\Eloquent\Builder; 

class EloquentBuilder extends Builder { 

    public $additionalColumns = []; 

    public function getModels($columns = ['*']) { 
     $oldColumns = is_null($this->query->columns) ? [] : $this->query->columns; 
     $withTablePrefix = $this->getModel()->getTable() . '.*'; 
     if (in_array('*', $columns) && !in_array($withTablePrefix, $oldColumns)) { 

      $this->query->addSelect(array_merge($columns, array_values($this->additionalColumns))); 
     } elseif (in_array($withTablePrefix, $oldColumns)) { 
      $this->query->addSelect(array_values($this->additionalColumns)); 
     } else { 
      foreach ($this->additionalColumns as $name => $additionalColumn) { 
       if (!is_string($name)) { 
        $name = $additionalColumn; 
       } 
       if (in_array($name, $columns)) { 
        if (($key = array_search($name, $columns)) !== false) { 
         unset($columns[$key]); 
        } 
        $this->query->addSelect($additionalColumn); 
       } 
      } 
      if (is_null($oldColumns)) { 

       $this->query->addSelect($columns); 
      } 
     } 

     return parent::getModels($columns); 
    } 

} 

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

class User extends Model { 
    ... 
    use App\Classes\AdditionalColumnsTrait; 

    protected function getAdditionalColumns() { 
     return [ 
      'siblings' => DB::raw(siblings(id) as siblings)), 
     ]; 
    } 
    ... 
} 

теперь ваш siblings колонке будет выбран по умолчанию. Также у вас есть возможность выбирать только определенные столбцы. Если вы не хотите выбирать дополнительные столбцы, вы можете использовать: User::find(['users.*']).

Возможно, это решение для вас.

+0

На самом деле, я хочу добавить 'siblings (id) как' sibling'' к красноречивым атрибутам, кроме того, что он получает от db – Ehs4n

Смежные вопросы