加入两个不使用非整数主键的模型之间的关系

时间:2017-09-25 07:37:35

标签: php sql laravel eloquent foreign-keys

我有两个模型:for idx in range(len(regions)): client.request_spot_instances( DryRun=False, SpotPrice=price_bids, InstanceCount=number_of_instances, LaunchSpecification= { 'ImageId': ami_id, 'KeyName': 'matrix', 'SecurityGroupIds': ['sg-5f07f52c'], 'SecurityGroups': ['MatrixSG'], 'InstanceType': machine_type, 'Placement': { 'AvailabilityZone': regions[idx], }, }, ) Holiday。这些看起来如下:

HolidayInfo

Holiday

class Holiday extends Model { protected $table = 'holidays'; protected $primaryKey = 'holiday_id'; public $timestamps = false; public function dates(){ return $this->hasOne('App\HolidayDates', 'holiday_id'); } public function images(){ return $this->hasMany('App\HolidayImages', 'holiday_id'); } public function info(){ return $this->hasOne('App\HolidayInfo', 'holiday_id'); } public function pricing(){ return $this->hasOne('App\HolidayPricing', 'holiday_id'); } }

HolidayInfo

我的桌子:

enter image description here enter image description here

如何在我的控制器中使用这些模型,同时使用简单的where子句?换句话说,HolidayInfo有一些我需要的信息以及Holiday,但以某种方式执行连接然后执行where语句以缩小数据会更有效。

这是我尝试的但它没有返回正确的数据:

class HolidayInfo extends Model
{
    protected $table = 'holiday_info';
    public $timestamps = false;
    protected $primaryKey = 'holiday_id';
    public function holiday(){
        return $this->hasOne('App\Holiday', 'holiday_id');
    }
}

这是返回的 - 你可以看到'info'返回null。 enter image description here

我也尝试过添加iCoders建议的条件:

$holidays = Holidays::with('info')->get();

返回以下内容,表明尚未执行连接:

Holidays::where('country', $country)->with('info')->get();

国家/地区是'holiday_info'表的一部分。

然而;执行此查询会从Holiday Info Table返回我需要的数据,但它会遗漏Holiday Table数据。

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'country' in 'where clause' (SQL: select * from holidays where country = australia)

运行以下内容后,会显示超过60个结果,因此SQL工作正常而不是laravel:

$holiday_info = Holidays::find(0)->info()->where('country', $country)->get();

如何组合模型/关系及其数据,以便在一个地方使用它?

3 个答案:

答案 0 :(得分:2)

Yuo已经在Holiday模型中添加了关系

public function info(){
        return $this->hasOne('App\HolidayInfo', 'holiday_id');
    }

您可以使用with

执行此类操作
Holiday::where(your condition)->with('info')->get();

更新

   public function info(){
        return $this->hasOne('App\HolidayInfo', 'holiday_id','holiday_id');
    }

如果你没有对表字段使用laravel约定,那么你将主键和外键传递给关系

有一个关系

hasOne($related, $foreignKey, $localKey )

答案 1 :(得分:0)

只需使用雄辩的

$holidays = Holiday::where(your condition)->with("info")->get();

然后在获取信息的价值时,只需使用:

foreach($holidays as $holiday){
    $holiday->info->youInfoFieldHere
}

答案 2 :(得分:0)

感谢@iCoders帮我解决了这个问题。

问题是public $incrementing = false;应该在假日模式中设置,因为它是非整数主键。