2015-10-17 3 views
2

Есть две таблицыметод Laravel модель со значением по умолчанию

  • продукты
  • фотографии (имеет PRODUCT_ID приоритет)

В моей модели продукта я могу получить все фотографии с:

public function pictures(){ 
    return $this->hasMany('App\Picture'); 
} 

Теперь я хочу создать в продукте, чтобы получить основной рисунок url ​​(наименьшее значение приоритета с product_id изображения), а если нет результата, возвращайте значение по умолчанию. Я пробовал:

public function mainpicture(){ 
    $picture = $this->pictures()->orderBy('priority','desc')->first(); 
    if($picture == null) 
     return 'default/default.png'; 
    return $picture->url; 
} 

Это дает ошибку:

Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation

При возврате значения она никогда от типа Осветите \ Database \ Eloquent \ Отношения \ Relation, но только в URL. Как я могу сделать метод для получения mainpicture или значения по умолчанию?

Причина, по которой я хочу создать эту функцию: потому что она мне нужна во многих точках зрения и не хочет вставлять один и тот же код во все виды. В настоящее время во всех видах, где мне нужно mainpicture я использую:

@if(isset($product->pictures[0])) 
    {!! Html::image('/images/product/'.$product->id.'/thumb/'.pictures[0]->url, 'Product image', array('class'=> ' img-responsive')) !!} 
@else 
    {!! Html::image('/images/product/default/default.png', 'No picture found', array('class'=> ' img-responsive')) !!} 
@endif 

Это очень спагетти, как и функция была бы гораздо лучше.

Я мог бы создать глобальную вспомогательную функцию, но мне любопытно, могу ли я добавить ее в свою модель.

ответ

4

Я знаю, что у вас уже есть рабочее решение от Kota. Но могу ли я предложить альтернативный подход:

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

Они определяются следующим образом:

public function getCustomAttribute() 
{ 
    return 'foo'; 
} 

Так что в вашем случае:

public function getMainpictureAttribute() 
{ 
    $picture = $this->pictures()->orderBy('priority')->first(); 
    return ($picture) ? $picture->url : 'default/path.jpg'; 
} 

на ваш взгляд, теперь вы можете получить к нему доступ с $product->mainpicture

Теперь, как чистая является то, что? И ваше сохранение дополнительного запроса для каждого продукта.

-1

Предлагаю вам использовать Query Scope. Например:

class Product extends Model 
{ 
    public function scopeMainpicture($query) 
    { 
     return $query->orderBy('priority','desc'); 
    } 

} 

Затем в контроллере, вы можете использовать это как:

$main_picture_url = $product->mainpicture()->first()->url; 

//send it to the view 
return ('myview').with('main_picture_url',$main_picture_url); 

Тогда в представлении, просто сделать это:

{{!! $main_picture_url !!}} 
+0

Спасибо за предложение.Проблема была бы в том, что мне нужно добавить ее к каждой функции контроллера для представления, где она мне нужна, было бы намного проще, если бы я мог вызвать $ product-> mainpicture в представлениях, где мне это нужно. –

+0

вы можете позвонить в $ product-> mainpicture. попробуйте – codegeek

+0

Я добавил его к моему мнению, как {!! $ product-> mainpicture-> url !!} Я получаю сообщение об ошибке «Попытка получить свойство не-объекта» также у меня все равно не будет значения по умолчанию, если результата нет. –

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