2015-08-02 6 views
5

Czy można wysiewać powiązane tabele używając następujących w Laravel 5?Czy mogę użyć php artisan db: seed do wysiewania powiązanych tabel?

php artisan db:seed 

Mam dwie tabele

users 
    id 
    first name 

projects 
    id 
    name 

i stół obrotowy

project_user 
    project_id 
    user_id 

Chciałbym utworzyć liczbę użytkowników, liczbę projektów, a następnie odnieść użytkowników i ich odpowiednie projekty.

Wysiewanie użytkowników i projektów nie stanowi problemu, ale nie mam pewności, jak obsłużyć tabelę przestawną.

Czy to możliwe?

Odpowiedz

1

Oczywiście, że możesz. Jeśli używasz Eloquent, możesz po prostu pracować z normalnymi relacjami (może najłatwiej). Lub jeśli używasz bezpośrednio budowniczego SQL, możesz karmić tabelę tak samo, jak normalnie, ale musisz trzymać się reguł dotyczących klucza obcego.

Po prostu spróbuj, a zobaczysz. Ale upewnij się, że importujesz używane klasy.


Dodawanie relacji między dwoma modelami jest łatwe, ale istnieją pewne różnice pomiędzy popularnych typów relacji (a on perspektywy): jeden-do-wielu, wiele-do-jednego i wiele-do-wielu.


jeden do wielu i wiele-do-jednego

Przyjęto, że każdy z Państwa projektu ma twórca, właściciel tak powiedzmy do, można mieć 1: N relacji między User i Project.

public class User { 
    public function ownedProjects() { 
     return $this->hasMany('App\Project'); 
    } 
} 

public class Project { 
    public function owner() { 
     return $this->belongsTo('App\User'); 
    } 
} 

W tym zakresie, można dołączyć Project Do User lub poinformować Project kto jest jego właścicielem.

// Attach a project to an user 
$project = Project::create([]); 
User::find($id)->ownedProjects()->save($project); 
// There is also a function saveMany() for an array of projects 

// Tell the project who his owner is 
$project = Project::create([]); 
$project->owner()->associate(User::find($id)); 


Wiele do wielu

W twoim przypadku, potrzebujemy wiele-do-wielu relacji między Users i Projects. Składnia jest nieco inna, ale wynik jest całkiem prosty.Najpierw musimy relacji między obu modeli:

public class User { 
    public function projects() { 
     return $this->belongsToMany('App\Project'); 
    } 
} 

public class Project { 
    public function users() { 
     return $this->belongsToMany('App\User'); 
    } 
} 

Wtedy możemy kwerendy relację właśnie tak:

$project = Project::create([]); 
User::find($id)->projects()->attach($project->id); 

Można również dołączyć całą masę projektów, robić te same rzeczy od druga strona, odłączyć modele lub zsynchronizować je, jeśli chcesz, aby upewnić się, że dokładna kwota (i tylko ta kwota) jest w relacji:

// Adds a relation for the user to projects with ids 1, 2, 4 and 6 
User::find($id)->projects()->attach([1, 2, 4, 6]); 

// Adds the users with ids 19 and 173 to this project 
Project::find($id)->users()->attach([19, 173]); 

// Removes the user 19 from the projects relations 
Project::find($id)->users()->detach(19); 

// Removes all relations between this user and projects that are 
// not listed in the synchronization array and adds a relation 
// to all projects where none exists yet 
User::find($id)->projects()->sync([4, 7, 19, 6, 38]); 

jest to normalny składni dla wielu-do-wielu relacje, ale możesz także dołączyć modele tak, jak w stosunku jeden do wielu:

// Creation of project could also be done before and saved to a variable 
User::find($id)->projects()->save(Project::create([])); 
+0

OK, więc jak radzić sobie z dynamicznymi identyfikatorami w tabeli przestawnej? –

+0

Nie jesteś pewien co masz na myśli. Jeśli poprawnie utworzysz Wymowne relacje, Laravel poradzi sobie z tym za Ciebie. – Namoshek

+0

O rany, rozumiem, co masz na myśli. Moje relacje są poprawnie skonfigurowane ... ale nadal nie jestem pewien, jak faktycznie wykonać ten kolejny krok. Być może coś takiego jak User :: create (['John]) -> with (Project :: create ([' Power Tools ' ]) (oczywiście nie jest to prawidłowa składnia)? –

Powiązane problemy