BG Development


  Reply to this topicStart new topicStart Poll

> Laravel Get Multiple Relationship Data
miss
Публикувано на: 01-06-2021, 14:30
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 34
Регистриран на: 14.04.15



Имам три таблици:

users
id - integer
name - string

jobs
id - integer
user_id - integer (foreign key to users.id)
company_id - integer (foreign key to companies.id)
name - string

companies
id - integer
name - string

Relationship-a между users и jobs е one to many, т.е. един потребител може да има много длъжности.

Съответно:

User.php
CODE

public function jobs()
   {
       return $this->hasMany(Job::class);
   }


Job.php
CODE

public function users()
   {
       return $this->belongsTo(User::class);
   }


Във UserController-a записвам в променлива потребителя и неговите длъжности:
CODE

$users = User::with('jobs')->paginate(10);


А след това във View-то като завъртя един цикъл на $users, мога да достъпя и неговата работа:
CODE

@foreach($users as $user)
   @foreach($user->jobs as $job)
       {{ $job->name }}
       {{ $job->company_id }}
   @endforeach
@endforeach


Само че вместо id-то на компанията {{ $job->company_id }} искам да взема нейното име. Как мога да направя това, без да правя допълнителна заявка в контролера към модела Company?

Тоест, искам да достъпя името на компанията директно през relationshipa User->Job->Company_Name, както достъпвам и $user->job->name

Това мнение е било редактирано от miss на 01-06-2021, 14:33
PMEmail Poster
Top
escapeboy
Публикувано на: 01-06-2021, 14:44
Quote Post



Име: Никола Кацаров
Група: Потребител
Ранг: Редовен член

Мнения: 432
Регистриран на: 04.12.04



CODE
$users = User::with('jobs.company')->paginate(10);


Ако нещо не се получи може и (без да променяш горното)
CODE
$job->company->name

Ако не е заредено в първата заявка ще си направи за всеки $job заявка, за да вземе компанията. Не е добра практика, но едва ли ще ти е проблем.


--------------------
PMEmail PosterUsers Website
Top
miss
Публикувано на: 01-06-2021, 15:05
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 34
Регистриран на: 14.04.15



QUOTE (escapeboy @ 01-06-2021, 14:44)
CODE
$users = User::with('jobs.company')->paginate(10);


Ако нещо не се получи може и (без да променяш горното)
CODE
$job->company->name

Ако не е заредено в първата заявка ще си направи за всеки $job заявка, за да вземе компанията. Не е добра практика, но едва ли ще ти е проблем.

Хмм.. тук, мисля че трябва да се напише името на таблицата, а не името на модела
CODE
$users = User::with('jobs.companIES')->paginate(10);


А сега по същество - поначало нямам relationship между таблиците companies и jobs и съвсем естествено като направя това, което си казал, излиза грешка:
CODE
Call to undefined relationship [company] on model [App\Models\Job].


След това направих relationship, която е отново "one to many", но когато направя die&dump на $job във view-то - да, има relationship с companies, но е null:
CODE
#relations: array:1 [▼
   "companies" => null
 ]


Това мнение е било редактирано от miss на 01-06-2021, 15:06
PMEmail Poster
Top
fox4o
Публикувано на: 01-06-2021, 17:15
Quote Post



Име:
Група: Потребител
Ранг: Посетител

Мнения: 61
Регистриран на: 08.03.05



Може да видиш този Пост като пример..


--------------------
PMEmail Poster
Top
miss
Публикувано на: 01-06-2021, 17:28
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 34
Регистриран на: 14.04.15



QUOTE (fox4o @ 01-06-2021, 17:15)
Може да видиш този Пост като пример..

В случая не върши работа, тъй като аз нямам user_id в таблица companies.

Всеки потребител има работа, а работата принадлежи на компания.

Когато листвам всички потребители в таблица, искам да взема името на работата им, както и името на компанията им.
PMEmail Poster
Top
escapeboy
Публикувано на: 02-06-2021, 08:34
Quote Post



Име: Никола Кацаров
Група: Потребител
Ранг: Редовен член

Мнения: 432
Регистриран на: 04.12.04



Защо правиш oneToMany когато имаш company_id в jobs? Трябва ти belongsTo.
При with() се пише името на релацията.
Няма логика да имаш oneToMany на jobs, но дори и да ти е нужно може да обхождаш $job->companies... или нещо от рода на implode(', ', $job->companies->pluck('name'))


--------------------
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0