Laravel 5 Eloquent相关模型返回没有ID的特定字段


Laravel 5 Eloquent related model return specific fields without ID

我有两个模型,公平坐标。坐标有许多Fair。

Fair检索相关的坐标时,我只想返回经度纬度,不返回时间戳或ID。

运行$fairs = Fair::with('coordinates')->get();时,坐标关系为Null

如果我将Fair模型中belongsToselect方法更改为return $this->belongsTo('App'Coordinate', 'coordinate_id')->select(array('id', 'longitude', 'latitude'));

响应是正确的,但它包括ID。

"coordinates":{
    "id": 1,
    "longitude":"-25.704571",
    "latitude":"59.145973"
},

有没有一种方法可以在不包括ID的情况下使用select方法?

我发现如果我也将protected $hidden = ['id'];添加到坐标模型中,我想要的响应是正确的。

"coordinates":{
     "longitude":"-25.704571",
     "latitude":"59.145973"
 },

这似乎不是正确的做法。

展会:

namespace App;
use Illuminate'Database'Eloquent'Model;
class Fair extends Model
{
    protected $dateFormat = 'c';
    public function coordinates()
    {
        return $this->belongsTo('App'Coordinate', 'coordinate_id')->select(array('longitude', 'latitude'));
    }
}

坐标:

<?php
namespace App;
use Illuminate'Database'Eloquent'Model;
class Coordinate extends Model
{
    protected $fillable = ['longitude', 'latitude'];
    public function fairs()
    {
        return $this->hasMany('App'Fair');
    }
}

您可以使用:1.

$fairs = (new Fair)->get();
foreach($fairs as $fair){
    echo $fair->coordinates->longitude;
}

以及2.

$fairs = (new Fair)->with('coordinates')->get();
foreach($fairs as $fair){
    echo $fair->coordinates->longitude;
}

不同之处在于2。案例使用热切加载(查询优化)更多关于:http://laravel.com/docs/5.1/eloquent-relationships#eager-加载

默认情况下,Laravel不连接(执行连接查询),当您引用连接的数据时,它会连接(执行联接查询),如这里的"$fair->坐标->经度"。

您可以使用一个闭包来选择所需的列,并使用addSelect方法进行热切加载:

$posts = Fair::with(array('coordinates' => function($query)
{
    $query->addSelect(array('longitude', 'latitude'));
}))->get();

这样,您就不必在结果中永久隐藏id列,而只需要针对特定查询。

如果您只想在一个查询中完成所有操作,您可以加入并选择

$data = Fair::query()
    ->join('coordinates','coordinates.id','=','fairs.coordinate_id')
    ->get(['fairs.*','coordinates.latitude','coordinates.longitude'])

如果你使用热切加载,那么你别无选择,只能获得id,因为这就是映射结果的方式,这样结果将只是Fair属性的一部分。