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.*');
看起来很奇怪,但确实有效。
我正在使用 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.*');
看起来很奇怪,但确实有效。