我有一个来自另一个软件的SQLite数据库,我需要将其集成到我自己的API中。我通过在Laravel中为我的API添加模型和关系,成功地开始了这个任务(多个数据库)。
但现在我已经到了无法继续的地步,因为我不知道如何使用“rowid”作为关键字在该外来数据库中建立两个表之间的关系。
我尝试了什么:
为这两个模型添加了一个通常的关系:
模特A: 有一个名为“BU_ZIMMER”的列存储另一个模型(B)的“rowid”
class LdBooking extends Model
{
protected $connection = 'lodgitDB';
protected $table = 'b_buchungen';
protected $primaryKey = 'rowid';
public $timestamps = false;
public function rentalunit()
{
return $this->belongsTo('App\Models\LodgitDesk\LdRentalunit', 'BU_ZIMMER', 'rowid');
}
}
模型B:具有由其他模型链接的rowid。
class LdRentalunit extends Model
{
protected $connection = 'lodgitDB';
protected $table = 'o_mieteinheit';
protected $primaryKey = 'rowid';
public $timestamps = false;
public function bookings()
{
return $this->hasMany('App\Models\LodgitDesk\LdBooking', 'rowid', 'BU_ZIMMER');
}
}
控制器:使用“with()”方法获取所有数据。这适用于所有“普通链接”,但不适用于指向SQLite rowid的链接。
public function show($id)
{
return $this->respond( LdBooking::with('rentalunit')->with('category')->select('rowid', '*')->findOrFail($id) );
}
结果:
问题:
我认为问题是,标准查询不会从表中选择rowid。这就是我通常手动将它们添加到Eloquent-Query ->select('rowid', '*')
的原因。但我不知道如何教我的关系,如果它通过键“rowid”加入另一个表,它需要首先选择这个“rowid”。
有没有办法做到这一点?也许修改模型?或者是否可以解决此问题?
我找不到有效的解决方案。
一个不那么干净的解决方案:
在Laravel文档中挖掘更多内容后,我找到了第一个解决方案。在Controller中,我将查询更改为:
public function show($id)
{
$booking = LdBooking::with(['rentalunit' => function($query) {
$query->select('rowid', '*');
}])->select('rowid', '*')->findOrFail($id);
return $this->respond($booking);
}
这会将链接的rentalunit提取给我并自动将其推送到返回的结果。
但是像这样在控制器中编写查询有点脏。我想直接在模型中解决这个问题,这样在控制器中我就可以编写->with('rentalunit')
。谁知道如何解决这个问题?
有没有方法
答案 0 :(得分:1)
好的,我已经尝试过mor来解决我的问题,看起来我找到了一个很好的解决方案,按照我想要的方式解决了这个问题:
模型A:
我从上面的问题中更改了模型,只是在那里添加了->select('rowid','*')
:
class LdBooking extends Model
{
protected $connection = 'lodgitDB';
protected $table = 'b_buchungen';
protected $primaryKey = 'rowid';
public $timestamps = false;
public function rentalunit()
{
return $this->belongsTo('App\Models\LodgitDesk\LdRentalunit', 'BU_ZIMMER', 'rowid')->select('rowid', '*');
}
}
现在上面我的问题中的相同控制器返回我的预订中的rentalunit而不添加额外的代码!我没想到Laravel如此强大!