Laravel 背包 - 在应用多个连接的过滤器后更改了 ID table

Laravel Backpack - ID changed after apply filter with several join table

我正在使用 Laravel Backpack 创建合适的后台。

但我对过滤器选项有一点疑问。 我的数据库中有几个 tables,它们由主键链接。

它做这样的事情:

站点 -> 地块(有 site_id)-> 树(有 parcel_id)

在我的代码中,在 TreeCrudCrontroller.php 我做了这样的事情:

$this->crud->addFilter([
    'type' => 'text',
    'name' => 'site',
    'label' => 'Site'
],
    false,
    function ($value) {
        $this->crud->addClause('join', 'parcels', 'parcel_id', 'parcels.id');
        $this->crud->addClause('join', 'sites', 'parcels.site_id', 'sites.id');
        $this->crud->addClause('where', 'sites.name', 'LIKE', "%$value%");
    }
);`

$this->crud->addFilter([
    'type' => 'text',
    'name' => 'owner',
    'label' => 'Propriétaire'
],
    false,
    function ($value) {
        $this->crud->addClause('join', 'parcels', 'parcel_id', 'parcels.id');
        $this->crud->addClause('join', 'sites', 'parcels.site_id', 'sites.id');
        $this->crud->addClause('join', 'owners', 'sites.owner_id', 'owners.id');
        $this->crud->addClause('where', 'owners.first_name', 'LIKE', "%$value%");
    }
);

在我的树模型中,我有以下代码:

public function parcel()
{
 return $this->belongsTo(Parcel::class);
}

public function displaySite()
{
  $site = Tree::with('parcel.site')->find($this->id);
  return $site->parcel->site->name;
}

public function displayOwner()
{
  $owner = Tree::with('parcel.site.owner')->find($this->id);
  return $owner->parcel->site->owner->full_name;
}

问题是,当我第一次显示我的 table 时,在没有过滤器的情况下,网站和所有者都显示正确的文本,但是当我对其中一个进行过滤时,当前树的 ID 是正在改变。

如果我使用按站点过滤,树 ID 将由站点 ID 更改 如果我使用按地块过滤,树 ID 由地块 ID 更改

不知道是我做错了什么还是bug。

我使用的是 Laravel、backpack/base 和 backpack/crud 的最新版本。

我希望我尽可能容易理解:)

感谢您的帮助

编辑:当我在我的 PMA 中尝试 SQL 请求时,我有这样的事情: SQL result

所以我认为 Laravel 尽管有第一个 ID 列,但只保留最后一个 ID 列

其实只要加一个select关闭即可。

$this->crud->addClause('select', 'my_table.*');

看起来很奇怪,但确实有效。