Laravel Backpack - 使用多个连接表应用过滤器后更改ID

时间:2017-11-28 08:47:00

标签: php mysql laravel crud backpack-for-laravel

我使用Laravel Backpack创建一个合适的后台办公室。

但是我对filter选项有一点问题。 我的数据库中有sereval表,它们通过主键链接。

它的确是这样的:

网站 - >包裹(具有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 如果我使用Parcel过滤,则树ID由包裹ID

更改

我不知道我做错了什么或者它是不是一个错误。

我在最新版本的Laravel,背包/底座和背包/背包上。

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

感谢您的帮助

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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