我有一个laravel DB集合,该集合使用联接检索数据。这样:
public static function getAllClientData(){
return DB::table('clients')
->join('accounts', 'clients.id', '=', 'accounts.client_id')
->join('addresses', 'clients.address_id', '=', 'addresses.id')
->select('clients.*', 'accounts.*', 'addresses.*')
->get();
}
现在,我想获取返回的数据库集合的值。但是,表帐户和客户都包含“注释”列。该列不是同一列,并且包含不同的值。如何遍历返回的数据库集合并访问/获取指定列的值?
到目前为止,我已经尝试过:
foreach($data as $item){
echo $item->addresses.comment;
echo $item->accounts.comment;
}
但是,它不起作用。如何告诉Laravel从表地址中获取列注释的值,并从表帐户中获取列注释的值?
答案 0 :(得分:0)
您可以用雄辩的方式来渴望您的关系
$clients = Client::with(['accounts','addresses'])->get();
在每次迭代中遍历$clients
时,您将为每个客户收集相关地址和帐户
class Client extends Model{
public function accounts(){
return $this->hasMany('App\Accounts','client_id');
}
}
如果一个客户端有一个地址,那么您与地址的关系就很可疑,那么可以在客户端表中有一个地址ID。如果一个客户端有多个地址,那么地址表中应该有一个client_id作为外键,
如果客户有一个地址
public function address()
{
return $this->belongsTo('App\Address', 'address_id');
}
如果客户有多个地址
public function addresses(){
return $this->hasMany('App\Address','client_id');
}
对于原始查询,如果2个表的列名称相同,则需要为其分配唯一的别名
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();
从一个联合查询中选择所有列也不是一个好主意,只选择您真正需要的列