Php Laravel 5.6一对一关系不起作用

Php Laravel 5.6一对一关系不起作用,php,laravel,eloquent,relationship,Php,Laravel,Eloquent,Relationship,我有一个BuildingImage模型,与BuildingType有一个OneToOne关系: BuildImage模型: /** * Get the source type of the Building Image. */ public function type() { return $this->hasOne('App\BuildingType'); } BuildingType模型: /** * Get the Building Image that owns t

我有一个BuildingImage模型,与BuildingType有一个OneToOne关系:

BuildImage模型:

/**
 * Get the source type of the Building Image.
 */
public function type()
{
    return $this->hasOne('App\BuildingType');
}
BuildingType模型:

/**
 * Get the Building Image that owns the building type.
 */
public function buildingImage()
{
    return $this->belongsTo('App\BuildingImage');
}
我的桌子:

building_images table->source是建筑类型id

建筑类型表

当我尝试在控制器中执行此操作只是为了测试: ImageRequest具有一个或多个Building,而一个BuildingType具有一个BuildingType

$imageRequest = ImageRequest::findOrFail($id);

$buildings = $imageRequest->buildingImages;

foreach ($buildings as $building) {
    dd($building->type);
}
我得到这个错误:

SQLSTATE[42S22]:未找到列:1054未知列 “where子句”SQL:select中的“building\u types.building\u image\u id”* 来自building_types,其中building_types.building_image_id=45 和building_types.building_image_id不为空限制1


我在这里做错了什么?

这是因为默认情况下,laravel将查找名为{model}\u id的主键,如果您使用的是不同的列名源,则在定义关系时需要指定:

作为文件:

Eloquent根据模型名称确定关系的外键。在这种情况下,手机型号自动假定具有用户id外键。如果希望重写此约定,可以将第二个参数传递给hasOne方法:

此外,Eloquent假设外键的值应与父项的id或自定义$primaryKey列匹配。换句话说,Eloquent将在电话记录的user_id列中查找用户id列的值。如果希望关系使用id以外的值,可以将第三个参数传递给指定自定义键的hasOne方法:

return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
现在这是清楚的。让我们谈谈这段关系本身

您正在定义BuildImage有一个BuildingType。但是使用这种逻辑,外键应该存储在building_types表中,而不是以另一种方式显示building_images表中的source列。而且-我只是假设-许多BuildImage可以属于特定的BuildingType。因此,如果这个假设是正确的:

BuildingImage属于特定的BuildingType。 可以在许多BuildImage中指定BuildinType 所以,你应该这样定义你的关系:

BuildImage.php

BuildingType.php


这是因为默认情况下,laravel将查找名为{model}\u id的主键,如果您使用的是不同的列名源,则在定义关系时需要指定:

作为文件:

Eloquent根据模型名称确定关系的外键。在这种情况下,手机型号自动假定具有用户id外键。如果希望重写此约定,可以将第二个参数传递给hasOne方法:

此外,Eloquent假设外键的值应与父项的id或自定义$primaryKey列匹配。换句话说,Eloquent将在电话记录的user_id列中查找用户id列的值。如果希望关系使用id以外的值,可以将第三个参数传递给指定自定义键的hasOne方法:

return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
现在这是清楚的。让我们谈谈这段关系本身

您正在定义BuildImage有一个BuildingType。但是使用这种逻辑,外键应该存储在building_types表中,而不是以另一种方式显示building_images表中的source列。而且-我只是假设-许多BuildImage可以属于特定的BuildingType。因此,如果这个假设是正确的:

BuildingImage属于特定的BuildingType。 可以在许多BuildImage中指定BuildinType 所以,你应该这样定义你的关系:

BuildImage.php

BuildingType.php


您是否尝试过这样指示索引ID

public function buildingImage()
{
    return $this->belongsTo('App\BuildingImage', 'image_request_id');
}
雄辩的决定关系的外键基于 型号名称。在这种情况下,手机型号会自动假定为 具有用户id外键。如果你想推翻这个惯例, 您可以将第二个参数传递给hasOne方法:


您是否尝试过这样指示索引ID

public function buildingImage()
{
    return $this->belongsTo('App\BuildingImage', 'image_request_id');
}
雄辩的决定关系的外键基于 型号名称。在这种情况下,手机型号会自动假定为 具有用户id外键。如果你想推翻这个惯例, 您可以将第二个参数传递给hasOne方法:


您的BuildImage模型应该是

/** *获取建筑图像的源类型。 */

而BuildingType模型应该是

/** *获取拥有建筑类型的建筑图像。 */

这应该行得通。 有关更多信息,请查看

您的BuildImage模型应该是

/** *获取建筑图像的源类型。 */

而BuildingType模型应该是

/** *获取拥有建筑类型的建筑图像。 */

这应该行得通。 有关更多信息,请查看

所以
我必须在你的代码示例中的外键中填写源代码?@Michael,我会更新。但是我觉得你应该对你的关系做一点不同的定义。你也可以使用类而不是字符串,包括我在内的一些人倾向于使用字符串。返回$this->hasOneApp\Phone::class,“外键”、“本地键”@是的,的确如此。很好的观察,我会把它包括进去。所以我必须在你的代码示例中的外键中填写源代码?@Michael,我会更新的。但是我觉得你应该对你的关系做一点不同的定义。你也可以使用类而不是字符串,包括我在内的一些人倾向于使用字符串。返回$this->hasOneApp\Phone::class,“外键”、“本地键”@是的,的确如此。很好的观察,我会包括在内。
public function buildingImage()
{
    return $this->belongsTo('App\BuildingImage', 'image_request_id');
}
return $this->hasOne('App\Phone', 'foreign_key');
public function type() {
    return $this->hasOne('App\BuildingType',"id","source"); 
}
public function buildingImage()
{
    return $this->belongsTo('App\BuildingImage',"source","id");
}