2013-06-04 15 views
14

Próbuję zaktualizować relację relacji jeden do wielu w Laravel. Niestety nie mogłem znaleźć dla niego żadnej dokumentacji. Czy ktoś może mi pomóc?Jak mogę zaktualizować istniejącą Wymowną relację w Laravel 4?

To, co mam tak daleko:

class Account extends Eloquent 
{ 
    public function users() 
    { 
     return $this->hasMany('User'); 
    } 
} 

class User extends Eloquent 
{ 
    public function account() 
    { 
     return $this->belongsTo('Account'); 
    } 
} 

Teraz próbuję zaktualizować zależność od użytkownika (1)> Konto (50) do użytkownika (1)> Konto (99). Jak to zrobić? Próbowałem następujące:

$account = Account::find(99); 

User::find(1)->account()->save($account); 

Ale to nie działa :-(Każda pomoc głęboko cenione !!

UPDATE:

następujące prace:

$user = User::find(1); 
$user->account_id = 99; 
$user->save(); 

.. .Ale MUSI być lepsze rozwiązanie, takie jak powyższe, prawda?

Działa w wielu do wielu rela Tionships z metodą save() i attach(), aby zaktualizować relacje między tabelami (z obu stron relacji). W relacjach jeden-do-wielu metoda attach() wydaje się nie być obsługiwana.

+0

To jak to powinno działać. Co oznacza "to nie działa"? Więcej szczegółów, proszę ... – Franz

+0

Mówi "Call to undefined method Illuminate \ Database \ Query \ Builder :: save()" jeśli używam konta "User :: find (1) ->() -> save ($ konto);" podejście ... – santacruz

+0

try User :: find (1) -> account-> save ($ account); –

Odpowiedz

34

Taylor Otwell jest następujący:

$account = Account::find(99); 
User::find(1)->account()->associate($account)->save(); 

nie mogłem znaleźć sposobu współpracownik() w oficjalnych dokumentów. Więc jeśli ktoś szuka rozwiązania tego problemu. Proszę bardzo!

+6

Odpowiedź jest teraz również dostępna w oficjalnych dokumentach: http://laravel.com/docs/eloquent#inserting-related-models – santacruz

+1

Wygląda na to, że dokumentacja została przeniesiona do gałęzi głównej. http://laravel.com/docs/master/eloquent-relationships#updating-belongs-to -relationships – Jeemusu

+0

Dokumenty zostały przeniesione [tutaj] (https://laravel.com/docs/5.2/eloquent-relationships#inserting- powiązane modele) – Ian

0

**

Spróbuj

$user = User::find(); 
$account = Account::find()->user()->save($user) 

Przepraszam, ja nie rozumiem, co próbuje osiągnąć. Oficjalna odpowiedź

+0

to działa oczywiście, ale próbuję zmienić relację ze strony użytkownika, na podstawie użytkownika, a nie konta, które nie powinno być problemem i działa w innych ORMach, więc zamiast nakazać Eonquent, aby przypisać nowego użytkownika do konta, chcę powiedzieć, aby przydzielił mu nowe konto, a więc: Użytkownik :: znajdź (1) -> konto() -> zapisz (Konto :: znajdź (99)), nie martw się o terminologię, może to być jabłka i banany równie dobrze. Potrzebuję tylko znaleźć sposób na zaktualizowanie relacji z obu stron bez przypisywania adresu obcego ręcznie, jak opisano powyżej. – santacruz

+0

Dobrze między podaną przeze mnie metodą a podaną przez użytkownika metodą user-id, obejmowałeś edycję informacji o koncie z obu końców. Jeśli próbujesz zmienić identyfikator konta użytkownika i nic więcej, to podana metoda powinna działać poprawnie. – SamSquanch

+0

Nie ma to jednak sensu, ponieważ doskonale działa w relacji wiele do wielu. Jeśli na przykład konto może mieć wielu użytkowników, a użytkownik może należeć do wielu kont, relacja może zostać zaktualizowana za pomocą 'User :: find (1) -> accounts() -> attach (Account :: find (99)) 'LUB używając' Account :: find (99) -> users() -> attach (User :: find (1)) '. Powinno tak być również w przypadku relacji jeden do wielu. Nie widzę powodu, dla którego nie powinien. – santacruz

4

To w jaki sposób mam to zrobić

//step 1 

Moje migracje

class CreateUsersTable extends Migration { 

    public function up() 
    { 
     Schema::create('users', function(Blueprint $table) { 
      $table->engine = 'InnoDB'; 
      $table->increments('id'); 
      $table->string('first_name'); 
      $table->string('last_name'); 
      $table->timestamps(); 
     }); 
    } 

    public function down() 
    { 
     Schema::drop('users'); 
    } 

} 

class CreateUserDetailsTable extends Migration { 

    public function up() 
    { 
     Schema::create('user_details', function(Blueprint $table) { 
      $table->engine = 'InnoDB'; 
      $table->increments('id'); 
      $table->integer('user_id')->unsigned()->unique('user_id', 'user_details_user_id'); 
      $table->foreign('user_id')->references('id')->on('users'); 
      $table->enum('gender', array('male', 'female'))->nullable(); 
      $table->string('city')->nullable(); 
      $table->date('date_of_birth')->nullable(); 
      $table->timestamps(); 
     }); 
    } 

    public function down() 
    { 
     Schema::drop('user_details'); 
    } 

} 

Następnie

//step 2 

moje modele bazowe

class UserDetail extends Eloquent { 

    protected $guarded = array(); 

    protected $table = 'user_details'; 

    public function user() 
    { 
     return $this->belongsTo('User'); 
    } 
} 

class User extends Eloquent { 

    protected $table = 'users'; 

    protected $guarded = array(); 

    public function detail() 
    { 
     return $this->hasOne('UserDetail'); 
    } 
} 

Następnie

//step 3 

Moja Sterowniki - Aktualizacja user_details schematu

//When Updating records i get the raw data from say an input 
    $detail = Input::all(); 

    //then find the user 
    $user = User::find(1); 

    //then update the details 
    $detail = $user->detail()->update($detail); 

    //then respond back with the detail 
    Response::json($detail); 

moim kontrolerów - tworzenie user_details schematu

//again get data input from source, the source does not come with user id 
    $detail = Input::all(); 

    //when creating new record 
    $detail = new UserDetail($detail); 
    $detail = $user->detail()->save($detail); 
    return Response::json($detail); 

I to wszystko dla tworzenia i aktualizowania nowych rekordów za pomocą laravel 4 za relacje belongsTo