【问题标题】:Laravel: Iterate through join collectionLaravel:遍历连接集合
【发布时间】:2018-12-09 09:17:07
【问题描述】:

我有一个使用连接检索数据的 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();
}

现在我想获取返回的数据库集合的值。但是,表accounts 和clients 都包含“comment”列。此列不是同一列,包含不同的值。如何遍历返回的数据库集合并访问/获取指定列的值?

到目前为止我已经尝试过了:

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

但是,它不起作用。如何告诉 Laravel 从表地址和下一个表帐户中获取列注释的值?

【问题讨论】:

  • 尝试转储数据以了解如何在 php.ini 中检索数据。 dd($data);
  • 你不能建立 Eloquent 关系吗?!你正在使用 Laravel 而不是它最强大的功能Eloquent ORM

标签: mysql laravel join eloquent iteration


【解决方案1】:

您可以使用雄辩的方式来急切地加载您的关系

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

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

【讨论】:

    猜你喜欢
    • 2018-06-16
    • 2017-08-19
    • 2014-08-13
    • 2017-11-20
    • 2014-04-11
    • 2020-09-10
    • 2018-02-19
    • 1970-01-01
    相关资源
    最近更新 更多