繁体   English   中英

Laravel背包-应用带有多个联接表的过滤器后ID发生更改

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

我正在使用Laravel背包创建适当的后台。

但是我对filter选项有一点问题。 我的数据库中有服务表,这些表通过主键链接。

它做这样的事情:

站点->包裹(具有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%");
    }
);

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

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

问题是,当我第一次显示表时,没有过滤器,当我对其中一个进行过滤时,站点和所有者都会显示正确的文本,但当前树的ID会发生变化。

如果我用于按站点进行过滤,则树ID会被站点ID更改。

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

我使用的是最新版本的Laravel,背包/底座和背包/背包。

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

谢谢你的帮助👍

编辑:当我尝试在PMA中的SQL请求时,我有这样的东西: SQL结果

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

实际上,只需要添加一个选择关闭。

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

看起来很奇怪,但是可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM