Eloquent relationship returns null,但类似的可以
Eloquent relationship returns null, but a similar one is fine
使用 Lumen 5.5.2 和 illuminate/database v5.5.17.
我设置了 3 个模型,其中一个属于另一个 2。所以引用,有一个区域和一个仓库。
与depot的关系符合预期,区域returns null.
例如
$quoteModel = new Quote();
$quote = $quoteModel
->with('area')
->with('depot')
->where('id', '=', $id)
->first();
echo 'depot id : ' , $quote->depot->id , "<br>\n";
echo 'area id : ' , $quote->area->id , "<br>\n";
会回显depot id,区域会报错,因为不是对象
将模型名称作为数组传递 ->with(['area', 'depot'])
,或仅请求区域(任一方法)都无法解决问题。
Quote.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class Quote extends EloquentModel {
protected $table = 'quotes';
public function area() {
return $this->belongsTo('\App\Models\Area', 'area_id', 'id');
}
public function depot() {
return $this->belongsTo('\App\Models\Depot', 'depot_id', 'id');
}
}
Area.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class Area extends EloquentModel {
protected $table = 'areas';
public $timestamps = false;
public $incrementing = false;
public function quotes() {
return $this->hasMany('\App\Models\Quote', 'area_id', 'id');
}
}
Depot.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class Depot extends EloquentModel {
protected $table = 'depots';
public $timestamps = false;
public $incrementing = false;
public function quotes() {
return $this->hasMany('\App\Models\Quote', 'depot_id', 'id');
}
}
如果我在 Area.php 中创建一个解析错误,脚本将失败,证明它正在被包含。
我设置了一个侦听器,因此我可以记录查询,它们显示得很好。
select * from `quotes` where `id` = 99192 limit 1
select * from `areas` where `areas`.`id` in (072)
select * from `depots` where `depots`.`id` in (07)
如果我 运行 区域手动查询它 returns 我期望的行。
我试过更改区域关系的名称,但没有用。
所以缺少的一块拼图是,作为更新现有网络应用程序的一部分,该项目是针对遗留数据库设置的。
事实证明存在一些数据类型不一致;当我可以成功 link 另一个没有问题的模型时,我发现了这一点。 area_id 的字段通常是一个零填充的整数,但由于某些原因在引号 table 上它是一个字符;所以数据在管理员中浏览时看起来是正确的,并且在复制和粘贴时有效,但在 Eloquents 内部的某个地方不匹配。
更改 table 上的数据类型可解决此问题。
使用 Lumen 5.5.2 和 illuminate/database v5.5.17.
我设置了 3 个模型,其中一个属于另一个 2。所以引用,有一个区域和一个仓库。
与depot的关系符合预期,区域returns null.
例如
$quoteModel = new Quote();
$quote = $quoteModel
->with('area')
->with('depot')
->where('id', '=', $id)
->first();
echo 'depot id : ' , $quote->depot->id , "<br>\n";
echo 'area id : ' , $quote->area->id , "<br>\n";
会回显depot id,区域会报错,因为不是对象
将模型名称作为数组传递 ->with(['area', 'depot'])
,或仅请求区域(任一方法)都无法解决问题。
Quote.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class Quote extends EloquentModel {
protected $table = 'quotes';
public function area() {
return $this->belongsTo('\App\Models\Area', 'area_id', 'id');
}
public function depot() {
return $this->belongsTo('\App\Models\Depot', 'depot_id', 'id');
}
}
Area.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class Area extends EloquentModel {
protected $table = 'areas';
public $timestamps = false;
public $incrementing = false;
public function quotes() {
return $this->hasMany('\App\Models\Quote', 'area_id', 'id');
}
}
Depot.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as EloquentModel;
class Depot extends EloquentModel {
protected $table = 'depots';
public $timestamps = false;
public $incrementing = false;
public function quotes() {
return $this->hasMany('\App\Models\Quote', 'depot_id', 'id');
}
}
如果我在 Area.php 中创建一个解析错误,脚本将失败,证明它正在被包含。
我设置了一个侦听器,因此我可以记录查询,它们显示得很好。
select * from `quotes` where `id` = 99192 limit 1
select * from `areas` where `areas`.`id` in (072)
select * from `depots` where `depots`.`id` in (07)
如果我 运行 区域手动查询它 returns 我期望的行。
我试过更改区域关系的名称,但没有用。
所以缺少的一块拼图是,作为更新现有网络应用程序的一部分,该项目是针对遗留数据库设置的。
事实证明存在一些数据类型不一致;当我可以成功 link 另一个没有问题的模型时,我发现了这一点。 area_id 的字段通常是一个零填充的整数,但由于某些原因在引号 table 上它是一个字符;所以数据在管理员中浏览时看起来是正确的,并且在复制和粘贴时有效,但在 Eloquents 内部的某个地方不匹配。
更改 table 上的数据类型可解决此问题。