在Laravel中以深层嵌套关系返回选定列

时间:2017-03-01 12:45:58

标签: php mysql laravel eloquent

我正在使用Laravel 5.3并尝试使用连接从多个表返回数据。

我正在使用以下相关的3个模型/表格,客户,商业和网站:

在Customer.php中:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Customer extends Model
{
  public function businesses()
  {
    return $this->hasMany('App\Business');
  }
}

在Business.php中:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Business extends Model
{
  public function customer() 
  {
    return $this->belongsTo('App\Customer');
  }

  public function websites()
  {
    return $this->hasMany('App\Website');
  }
}

在Website.php中:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Website extends Model
{  
  public function business() {
    return $this->belongsTo('App\Business');
  }
}

因此,Customer可以有多个Businesses,其中可以有多个Websites

现在,我正在尝试从({1}},CustomerBusiness中返回(理想情况下)一个Eloquent请求中的某些列。我知道我可以使用简单的预先加载来返回所有表中的所有列:

Website

但是我只想返回某些列并返回一个数组数组,如下所示:

Customer::with('businesses.websites');

即忽略id,外键,created_at时间戳等等。

我一直在尝试使用以下代码(及其变体)实现此目的:

[
  0 => {
    'first_name' => 'John',
    'last_name' => 'Smith,
    'email' => 'js@test.com',
    'businesses' => [ 
      0 => {
        'name' => 'Smith Ltd'
        'websites' =>  [
          0 => {
            'domain' => 'smithltd',
            'tld' => '.co.uk'
          }
        ]
      }
    ]
  } ...
]

但这也是我不想要的 Customer::with([ 'businesses' => function ($q) { $q->select('id', 'customer_id')->pluck('name'); }, 'businesses.websites' => function ($q) { $q->select('id', 'business_id')->pluck('domain', 'tld'); } ])->get(); idcustomer_id。据我所知,我需要在business_id查询中添加foreign_keyprimary_key以使查询正常工作,但有没有办法将其从最终返回的集合中删除?或者有更好的方法来解决这个问题吗?非常感谢任何帮助,非常感谢。

1 个答案:

答案 0 :(得分:0)

你可以用商业模式

做一个rray_merge

创建新功能

  public function getArrayWithCustomerAndWebsites()
  {
    return array_merge( "customer" => $this->customer(), etc..... );
  }

希望对你有所帮助!