Laravel: Como usar vários relacionamentos de tabela dinâmica

Eu sou novo para definir relacionamentos e frameworks todos juntos, acabei de acostumar com raw sql. Na minha lição de casa (documentação google + laravel), mas acho que não estou entendendo isso corretamente.

Heres é a informação relevante: Tabela de usuários:

Table: Users id - int (auto increment) username - varchar 

Tabela de desafios:

 Table: Challenges id - int (auto increment) name - varchar 

User_challenge_links

 Table User_challenge_links id - int (auto increment) user_id - int challenge_sub_categories_id - int 

Categorias_destinação_destinação

 Table Challenge_sub_categories id - int (auto increment) category_id - sub_category_id - challenge_id - 

Então, meu objective … usuário-> desafios.

 class User extends Eloquent { protected $table = "users"; public function challenges() { // get user-> challenges } } 

As relações:

  • Um usuário tem muitos User_challenge_links
  • Um User_challenge_link tem um challenge_sub_categories_id (portanto, uma categoria de desafio_sub)
  • Um challenge_id de categorias_de_responsabilidades corresponde a um desafio na tabela de desafios

Qualquer ajuda, mesmo me apontando na direção certa, será muito apreciada!

Editar: dados de exemplo: dados dos usuários

 Users id name 1 "Sjaak" 2 "Henk" 

Categorias Nome do ID do dado 1 “Foo” 2 “Barra”

Sub_categories Nome do ID do dado 1 “SubFoo” 2 “SubBar”

Desafios Dados id Nome 1 “Swing dat Foo” 2 “Bar todas as coisas” 3 “Foo The Bars”

Challenge_sub_categories Data

 id category_id sub_category_id challenge_id 1 1 1 1 2 2 1 1 3 1 2 2 4 2 1 3 5 2 2 2 

User_challenge_links Data

 id user_id Challenge_sub_categories_id 1 1 1 2 1 3 3 2 2 4 2 3 5 2 4 

Fluxo de dados:
Um usuário pode criar categorias ou usar as existentes e associar desafios a elas (existentes ou novas). No entanto, um usuário também pode optar por usar uma subcategoria, que ele então vincula a uma categoria e vincula desafios para isso.
Portanto, uma categoria é obrigatória, mas uma sub_categoria não é. Se, no entanto, uma sub-categoria é usada (novamente … existente ou nova), o desafio será conectado a essa subcategoria.

Nota: Uma sub-categoria pode ser conectada a várias categorias

 category - House sub_category - Cleaning Challenge - getting special soap category - Car sub_category - Cleaning Challenge - getting special soap category - Showering Challenge - getting special soap 

Estas são algumas situações possíveis

Esta configuração deve fazer você ir. Tentei manter a nomeação tão simples quanto possível.

 users id username challenge_user user_id challenge_id challenges id name topic_id category_id topics id name categories id name 

Definindo seus Modelos Eloquentes

 class User extends Eloquent { public function challenges() { return $this->belongsToMany('Challenge'); } } class Challenge extends Eloquent { public function users() { return $this->belongsToMany('User'); } public function topic() { return $this->belongsTo('Topic'); } public function category() { return $this->belongsTo('Category'); } } class Topic extends Eloquent { public function challenges() { return $this->hasMany('Challenge'); } } class Category extends Eloquent { public function challenges() { return $this->hasMany('Challenge'); } } 

Usando seus Modelos Eloquentes … apenas alguns exmaples do que você pode fazer.

 // Collection of all Challenges by Topic name Topic::with('challenges')->whereName($topic_name)->first()->challenges; // Collection of all Challenges by Category name Category::with('challenges')->whereName($category_name)->first()->challenges; // Collection of all Users by Challenge id Challenge::with('users')->find($challenge_id)->users; // Collection of Users with atleast 2 Challenges User::has('challenges', '>', 1)->get(); // Attach Challenge to User $user = User::find($id); $user->challenges()->attach($challenge_id); // Assign a Topic to a Challenge $challenge = Challenge::find($challenge_id); $topic = Topic::find($topic_id); $challenge->topic()->associate($topic); $challenge->save(); 

Referências e leituras sugeridas:

Laravel Eloquent Relationships belongsTo belongsToMany hasMany

Consultando Relações Model::has()

Eager Loading Model::with()

Propriedades dinâmicas para access a relações Resolve $model->relationship

Inserindo modelos relacionados attach() associate()

Query Scopes

Trabalhando com tabelas dinâmicas Se você precisa recuperar dados adicionais da tabela dinâmica.