Я использую Laravel 5.3 и пытаюсь вернуть данные из нескольких таблиц с помощью соединения.Как сгруппировать одно из многих отношений с присоединением в Laravel
Я использую 3 модели/таблицы, с клиентами, бизнес и сайт, которые связаны следующим образом:
В Customer.php:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Customer extends Model
{
public function businesses()
{
return $this->hasMany('App\Business');
}
}
В Business.php:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Business extends Model
{
public function customer()
{
return $this->belongsTo('App\Customer');
}
public function websites()
{
return $this->hasMany('App\Website');
}
}
И в Website.php:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Website extends Model
{
public function business() {
return $this->belongsTo('App\Business');
}
}
Таким образом, Customer
может иметь много Businesses
, которые могут иметь много Websites
. Теперь я пытаюсь использовать оператор объединения, чтобы возвращать список клиентов и связанные с ними сведения о бизнесе и веб-сайте. Я использую следующий код, чтобы вернуть эту информацию:
$customers = \DB::table('customers')
->join('businesses', 'customers.id', '=', 'businesses.customer_id')
->join('websites', 'businesses.id', '=', 'websites.business_id')
->select('customers.x', 'businesses.y', 'websites.z')
->get();
И я хотел бы, чтобы данные быть возвращение в массиве ассоциативных массивов клиентов с данными бизнес и веб-сайтов, вложенных в ассоциативном массиве, как так:
[
0 => {
$customer1Data,
$customer1BusinessData,
$customer1WebsiteData
}
1 => {
$customer2Data,
$customer2BusinessData,
$customer2WebsiteData
}
...
]
Это прекрасно работает, если клиент имеет один бизнес, который имеет один сайт, но предположим $customer1
имеет два предприятия, то выше соединение возвращает что-то в этом формате:
[
0 => {
$customer1Data,
$customer1BusinessData1,
$customer1WebsiteData
}
1 => {
$customer1Data,
$customer1BusinessData2,
$customer1WebsiteData
}
...
]
Есть ли способ, что я могу изменить джойн заявления, чтобы вернуться, что сценарий в этом формате:
[
0 => {
$customer1Data,
businesses => {
$customer1BusinessData1,
$customer1BusinessData2
}
...
}
]
Есть ли способ, я могу добиться этого с присоединиться заявлением? Или я должен подойти к этому по-другому? Любая помощь будет очень признательна, большое спасибо.
Вы еще не использовали красноречивого. вы можете просто использовать '$ customer = Customer :: with ('business', 'business.websites') -> all()' Это загрузит всех клиентов, их бизнес и его веб-сайты. поэтому вы можете просто использовать '$ customer-> business', чтобы получить все бизнес и вложенный цикл для получения веб-сайтов предприятий. –