2013-12-20 4 views
2

У меня есть две модели:Laravel Eloquent устанавливает значение по умолчанию для отношения модели?

class Product extends Eloquent { 

    ... 

    public function defaultPhoto() 
    { 
     return $this->belongsTo('Photo'); 
    } 

    public function photos() 
    { 
     return $this->hasMany('Photo'); 
    } 
} 

class Photo extends Eloquent { 

    ... 

    public function getThumbAttribute() { 
     return 'products/' . $this->uri . '/thumb.jpg'; 
    } 

    public function getFullAttribute() { 
     return 'products/' . $this->uri . '/full.jpg'; 
    } 

    ... 

} 

Это прекрасно работает, я могу назвать $product->defaultPhoto->thumb и $product->defaultPhoto->full и получить путь к соответствующему изображению, и получить все фотографии с помощью $product->photos и Перебор значений.

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

Я пытался делать вещи, такие как

public function photos() 
{ 
    $photos = $this->hasMany('Photo'); 
    if ($photos->count() === 0) { 
     $p = new Photo; 
     $p->url = 'default'; 
     $photos->add($p); 
    } 

    return $photos; 
} 

Я также создать совершенно новую Collection, чтобы сохранить новую Photo модель в, но они оба возвращают ту же ошибку:

Call to undefined method Illuminate\Database\Eloquent\Collection::getResults() 

Has кто-нибудь сделал что-нибудь подобное?

Заранее благодарен!

+0

Я бы не поместил такое поведение в модель. Я бы просто использовал - if ($ product-> photo === null) {do something} - в контроллере/представлении. – Dave

+0

Если вы хотите применить значения по умолчанию для этих элементов, не лучше ли это сделать на уровне базы данных? Это позволит обеспечить постоянную обработку ситуаций NULL. –

+0

Я обратился к следующему в представлении: '{{$ product-> defaultPhoto? $ product-> defaultPhoto-> thumb: '/img/default-product.png'}} ' –

ответ

5

Вы можете создать аксессор на модели продукта, который проверил вас. Работает так же, если вы просто хотели определить его как метод, также (хорошо, если вы хотите отвлечь некоторые вызовы Eloquent, использовать интерфейс для своего продукта, если вы его позже измените и т. Д.)

/** 
* Create a custom thumbnail "column" accessor to retrieve this product's 
* photo, or a default if it does not have one. 
* 
* @return string 
*/ 
public function getThumbnailAttribute() 
{ 
    $default = $this->defaultPhoto; 

    return (! is_null($default)) 
     ? $default->thumb 
     : '/products/default/thumb.jpg'; 
} 

Возможно, вы также захотите изучить Presenters. Немного перехитрить для некоторых ситуаций, но невероятно удобно иметь (и абстрактные вещи, подобные этому, от ваших моделей).

+0

Это! Ответ был в моем вопросе (я уже использовал аксессоров в фотомодели!) –

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