我正在使用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'來獲得所有的業務和一個嵌套的循環來獲取企業的網站。 –