2015-12-01 74 views
1

我有一个SQLite数据库从另一个软件,我需要集成到我自己的API。我通过在Laravel的API中添加模型和关系,成功开始了这个任务(多个数据库)。Laravel 5.1:与SQLite rowid的关系?

但现在我到了一个地步,我无法继续,因为我不知道如何通过使用“rowid”作为关键字在该外部数据库中的两个表之间建立关系。

我已经试过:

增加了一个通常的关系,这两种模式那样:

A型: 有一个名为 “BU_ZIMMER” 列存储的 “ROWID”其它模型(B)

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'); 
    } 
} 

控制器:通过使用 “具有()” 方法获取的所有数据。这适用于所有“正常链接”,但不适用于指向SQLite rowid的链接。

public function show($id) 
{ 
    return $this->respond(LdBooking::with('rentalunit')->with('category')->select('rowid', '*')->findOrFail($id)); 
} 

结果:

enter image description here

问题:

我认为问题是,标准的查询不会从表中选择的ROWID。这就是为什么我通常手动将它们添加到Eloquent-Query ->select('rowid', '*')。但我不知道如何教我的关系,如果它通过关键字“rowid”加入另一个表,它需要先选择“rowid”。

有没有办法做到这一点?也许修改模型?或者是否有可能解决这个问题?

我还找不到有效的解决方案。

一个不那么干净的解决方案:

的Laravel文档中挖掘更多后,我找到了第一个解决方案。在控制器我改变了查询:

public function show($id) 
{ 
    $booking = LdBooking::with(['rentalunit' => function($query) { 
             $query->select('rowid', '*'); 
            }])->select('rowid', '*')->findOrFail($id); 
    return $this->respond($booking); 
} 

这取我的链接rentalunit并自动将其推到返回的结果。

但是,像这样在控制器中写入查询有点脏。我想直接在模型中解决这个问题,所以在控制器中我可以简单地写->with('rentalunit')。任何人都知道如何解决此问题?

有没有办法

回答

1

好,我已经尝试铁道部来解决我的问题,它看起来像我发现,制定出办法,因为我想成为一个很好的解决方案:

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如此强大!