Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5雄辩的相关模型返回不带ID的特定字段_Php_Laravel_Eloquent_Laravel 5.1 - Fatal编程技术网

Php Laravel 5雄辩的相关模型返回不带ID的特定字段

Php Laravel 5雄辩的相关模型返回不带ID的特定字段,php,laravel,eloquent,laravel-5.1,Php,Laravel,Eloquent,Laravel 5.1,我有两种型号,普通型和坐标型。坐标有许多公平的 namespace App; use Illuminate\Database\Eloquent\Model; class Fair extends Model { protected $dateFormat = 'c'; public function coordinates() { return $this->belongsTo('App\Coordinate', 'coordinate_id'

我有两种型号,普通型和坐标型。坐标有许多公平的

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'));
    }
}
当从公平检索相关的坐标时,我只想返回经度纬度,没有时间戳或ID

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'));
    }
}
当我运行
$fairs=Fair::with('coordinates')->get()时坐标关系为Null

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'));
    }
}
如果我将Fair模型中
belongsTo
上的
select
方法更改为
return$this->belongsTo('App\Coordinate','Coordinate_id')->select(array('id','longitude','latitude')

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'));
    }
}
响应是正确的,但它包含ID

"coordinates":{
    "id": 1,
    "longitude":"-25.704571",
    "latitude":"59.145973"
},
是否有方法使用选择方法而不包括ID

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'));
    }
}
我发现如果我还添加了
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'));
    }
}
坐标:

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');
    }
}
您可以使用:
一,

及 二,

区别在于2。案例使用快速加载(查询优化)更多信息:


默认情况下,Laravel不联接(执行联接查询),当您引用联接数据时,它联接(执行联接查询),如此处“$fair->coordinates->longitude”。

您可以使用闭包选择所需的列,并使用
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,因为这是Elount映射结果的方式,这样结果将只是公平属性的一部分。

在我看来,隐藏属性似乎是从结果中排除列的正确方法。如果您想从模型中完全排除id,则该方法是正确的,尽管并非在所有情况下,您都希望排除它。另外,我的问题是,如果不包含ID列,为什么选择方法不起作用。请尝试使用get方法$this->belongsTo('App\Coordinate','Coordinate\u ID')->get(array('longitude','latitude'))而不是选择,这并不能真正回答问题。有没有一种方法可以在不提供id列的情况下使用select方法?