laravel:遍历join集合

c86crjj0  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(458)

我有一个laraveldb集合,它使用连接检索数据。因此:

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();
}

现在我想得到返回的db集合的值。但是,表accounts和clients都包含“comment”列。此列不是同一列,并且包含不同的值。如何遍历返回的db集合并访问/获取指定列的值?
我已经试过了:

foreach($data as $item){
    echo $item->addresses.comment;
    echo $item->accounts.comment;
}

然而,它不起作用。如何告诉laravel从表地址和表帐户中获取列注解的值?

pdkcd3nj

pdkcd3nj1#

你可以用雄辩的方式与你的关系

$clients = Client::with(['accounts','addresses'])->get();

当你循环通过 $clients 在每次迭代中,您将有一个针对每个客户机的相关地址和帐户的集合

class Client extends Model{

    public function accounts(){
       return $this->hasMany('App\Accounts','client_id');
    }

}

另外,您与地址的关系看起来可疑如果一个客户端有一个地址,那么在clients表中有一个地址id是可以的,如果一个客户端有多个地址,那么addresses表应该有一个client\u 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();

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

相关问题