Вы можете использовать красноречивый способ с нетерпением загрузить ваши отношения
$clients = Client::with(['accounts','addresses'])->get();
Когда вы перебираете $clients
на каждой итерации, у вас будет коллекция для связанных адресов и учетных записей для каждого клиента
class Client extends Model{
public function accounts(){
return $this->hasMany('App\Accounts','client_id');
}
}
Кроме того, ваши отношения с адресами выглядят подозрительно, если у клиента есть один адрес, тогда хорошо иметь идентификатор адреса в таблице клиентов. Если у клиента есть несколько адресов, то таблица адресов должна иметь client_id в качестве внешнего ключа,
Если у клиента один адрес
public function address()
{
return $this->belongsTo('App\Address', 'address_id');
}
Если у клиента более одного адреса
public function addresses(){
return $this->hasMany('App\Address','client_id');
}
Для вашего исходного запроса вам нужно присвоить им уникальный псевдоним, если две таблицы имеют одинаковые имена для столбцов
DB::table('clients')
->join('accounts', 'clients.id', '=', 'accounts.client_id')
->join('addresses', 'clients.address_id', '=', 'addresses.id')
->select('clients.*', 'accounts.*', 'addresses.*', DB::raw('accounts.comments as account_comments'),DB::raw('addresses.comments as address_comments'))
->get();
Также не рекомендуется выбирать все столбцы из объединенного запроса, выбирайте только те столбцы, которые вам действительно нужны