Laravel 5.1:与SQLite rowid的关系?

时间:2015-12-01 11:28:53

标签: php sqlite laravel laravel-5.1

我有一个来自另一个软件的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) );
}

结果:

enter image description here

问题:

我认为问题是,标准查询不会从表中选择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')。谁知道如何解决这个问题?

有没有方法

1 个答案:

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