2013-03-22 13 views
6

Jestem nowy w laravel i próbuję z nim zbudować album ze zdjęciami. Moim problemem jest to, że mogę korzystać z funkcji dołączania wstawić identyfikator użytkownika i identyfikator grupy do mojej bazy danych, to działa dobrze, ale w dokumentacji mówi to o funkcji attachLaravel Wymowne wielu do wielu Dołącz

Na przykład, być może rolę Ciebie chcesz dołączyć do użytkownika już istnieje . Wystarczy użyć dołączyć metoda:

więc chciałem go używać w taki sam sposób, jeśli album_id już istnieją tylko go zaktualizować, inny mądry wstawić thr nowy, ale moim problemem jest to, że zawsze insters, nie ma kontroli jeśli album_id już exsits

moim modelu

class User extends Eloquent 
{ 
    public static $timestamps = false; 

    public function album() 
    { 
     return $this->has_many_and_belongs_to('album', 'users_album'); 
    } 

} 

function post

public function post_albums() 
    { 

     $user = User::find($this->id); 

     $album_id = Input::get('album'); 

     $path = 'addons/uploads/albums/'.$this->id.'/'. $album_id . '/'; 

     $folders = array('path' => $path, 'small' => $path. 'small/', 'medium' => $path. 'medium/', ); 

     if (! is_dir($path)) 
     { 
     foreach ($folders as $folder) 
     { 
      @mkdir($folder, 0, true); 
     } 
     } 


    $sizes = array( 
     array(50 , 50 , 'crop', $folders['small'], 90), 
     array(164 , 200 , 'crop', $folders['medium'], 90), 
    ); 

    $upload = Multup::open('photos', 'image|max:3000|mimes:jpg,gif,png', $path) 
      ->sizes($sizes) 
      ->upload(); 

    if($upload) 
    { 
     $user->album()->attach($album_id); 
     return Redirect::back(); 
    } 
    else 
    { 
     // error show message remove folder 
    } 

    } 

Czy ktoś może wskazać, co robię źle? Czy całkowicie źle rozumiem funkcję dołączania?

+0

Przy okazji: http://area51.stackexchange.com/proposals/46607/laravel – Kriem

+0

co z opublikowanym linkiem? –

+0

Tylko link do propozycji wymiany stosu Laravel, dla tych, którzy są zainteresowani Laravel. – Kriem

Odpowiedz

1

Dzięki @Collin zauważyłem, że rozumieją zrobiłem czek wczoraj

$album = $user->album()->where_album_id($album_id)->get(); 

     if(empty($album)) 
     { 
      $user->album()->attach($album_id); 
     } 
6

Uważam, że źle zrozumiałeś funkcję dołączania. Funkcja synchronizacji używa załącznika do dodawania relacji, ale tylko wtedy, gdy relacja nie istnieje. Podążając za tym, co zostało zrobione, sugerowałbym wyciągnięcie listy identyfikatorów, a następnie wstawienie, gdyby nie istniało na liście.

$current = $user->album()->lists('album_id'); 
if (!in_array($album_id, $current)) 
{ 
    $user->album()->attach($album_id); 
} 

Na marginesie zamierzam sugerować, że zgodnie z konwencją nazewnictwa z laravel domyślne. Metodą relacji powinno być $ user-> albumy(), ponieważ jest ich wiele. Tabela przestawna powinna również mieć nazwę "album_user". Podziękujesz sobie później.

2

Contains method of Laravel Collections

Zbiory laravel zapewnia bardzo użyteczną metodą 'zawiera'. Określa, czy klucz istnieje w kolekcji. Możesz pobrać kolekcję w swojej sprawie, używając $user->album. Możesz zauważyć różnicę, że album jest bez paranthezy.

kod

Praca Teraz wszystko trzeba było zrobić, to użyć metody contains. Pełny kod będzie.

if (!$user->album->contains($album_id) 
{ 
    $user->album()->attach($album_id); 
} 

Jest to bardziej przejrzysty i "Laravel" sposób uzyskania wymaganego rozwiązania.

+0

Jest to przydatne, ale wydaje się marnotrawstwem, gdy trzeba wyciągnąć z bazy danych wszystkie szczegóły wszystkich albumów dla użytkownika. Chcesz tylko wiedzieć, czy określony album należy do tego użytkownika. – Jason