Laravel:遍历join集合

时间:2018-06-30 10:56:41

标签: mysql laravel join eloquent iteration

我有一个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从表地址中获取列注释的值,并从表帐户中获取列注释的值?

1 个答案:

答案 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();

从一个联合查询中选择所有列也不是一个好主意,只选择您真正需要的列