php - 拉维尔 5.1 : Relationships with SQLite rowid?

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

Controller :使用“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);
}

这为我获取了链接的租赁单元并自动将其推送到返回的结果。

但是像这样在 Controller 中编写查询有点脏。我想直接在模型中解决这个问题,这样在 Controller 中我只需编写 ->with('rentalunit') 即可。有谁知道如何解决这个问题吗?

有没有办法

最佳答案

好吧,我已经尝试了更多方法来解决我的问题,看起来我已经找到了一个很好的解决方案,并且按照我想要的方式工作:

模型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', '*');
  }
}

现在,我上面问题中的同一 Controller 返回了我预订中的租赁单元,而无需添加额外的代码!没想到 Laravel 这么强大!

关于php - 拉维尔 5.1 : Relationships with SQLite rowid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34019297/

相关文章:

postman 没有得到 Json View

php - 在单独的页面上显示 WordPress 帖子

javascript - 与 ID 项建立链接

android - 选择最后一行

sql - 有没有一种方法可以选择SQL中的成对列表中的行?

laravel - 如何在 postgresql 中使用 laravel 迁移特定或自定义模式

php - 当 session 驱动程序是数据库 Laravel 时 token 未匹配

php - Laravel Eloquent 加入奇怪的查询

sql - SQLite选择不同的where子句

laravel - 类 'Illuminate\Html\HtmlServiceProvider' 未找到 Laravel 5