首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让页面显示Nova中的所有关系

如何让页面显示Nova中的所有关系
EN

Stack Overflow用户
提问于 2019-10-03 07:41:12
回答 1查看 243关注 0票数 0

如何让一个资源视图在view all resource页面中显示所有关系的数据(希望仍然是可排序和可搜索的)?

例如,我有两个表:

product_name - id、供应商产品- id、供应商、年份

我想要一个视图来显示表:

厂商ID |厂商名称|产品ID |产品名称|年份

目前,我有一个页面的供应商和一个页面的产品。我想把结果合并成一个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-12 18:56:45

对于您的表结构和您的需求,我建议这样的解决方案:

代码语言:javascript
复制
// database\migrations\2019_10_04_153155_create_vendors_table.php
        Schema::create('vendors', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name',100);
            $table->timestamps();
        });
// database\migrations\2019_10_04_153325_create_products_table.php
        Schema::create('products', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name',100);
            $table->integer('year');
            $table->timestamps();
        });
// database\migrations\2019_10_04_154713_create_product_vendor_table.php
        Schema::create('product_vendor', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('product_id');
            $table->bigInteger('vendor_id');
            $table->timestamps();
        });
// app\Product.php
class Product extends Model
{
    public function vendors()
    {
        return $this->belongsToMany(Vendor::class,'product_vendor');
    }
}
// app\Vendor.php
class Vendor extends Model
{
    public function products()
    {
        return $this->belongsToMany(Product::class,'product_vendor');
    }
}
// app\ProductVendor.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use \App\Product;
use \App\Vendor;
class ProductVendor extends Model
{
    protected $table = 'product_vendor';
    public function GetColumnProductNameAttribute()
    {
        if($this->product_id){
            return Product::find($this->product_id)->name;
        }else{
            return '';
        }
    }
    public function GetColumnVendorNameAttribute()
    {
        if($this->vendor_id){
            return Vendor::find($this->vendor_id)->name;
        }else{
            return '';
        }
    }
    public function GetColumnProductYearAttribute()
    {
        if($this->product_id){
            return Product::find($this->product_id)->year;
        }else{
            return '';
        }
    }
}
// app\Nova\Product.php
    public static $title = 'name';
// app\Nova\Vendor.php
    public static $title = 'name';
// app\Nova\ProductVendor.php
<?php
namespace App\Nova;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use Laravel\Nova\Fields\Number;
use Illuminate\Http\Request;
use Laravel\Nova\Http\Requests\NovaRequest;
class ProductVendor extends Resource
{
    public static $model = 'App\ProductVendor';
    public static $title = 'id';
    public static function indexQuery(NovaRequest $request, $query)
    {
        return $query->join('vendors', 'product_vendor.vendor_id', '=', 'vendors.id')
        ->join('products', 'product_vendor.product_id', '=', 'products.id')
        ->select('vendors.name as column_vendor_name','products.name as column_product_name','products.year as column_product_year','product_vendor.*','products.*','vendors.*');
    }
    public static $search = [
        'id','products.name','vendors.name'
    ];
    public function fields(Request $request)
    {
        return [
            ID::make()->sortable(),
            ID::make('Vendor Id','vendor_id')
                ->sortable(),
            Text::make('Vendor Name','column_vendor_name')
                ->sortable()
                ->hideWhenCreating(),
            ID::make('Product Id','product_id')
                ->sortable(),
            Text::make('Product Name','column_product_name')
                ->sortable()
                ->hideWhenCreating(),
            Text::make('Product Year','column_product_year')
                ->sortable()

        ];
    }
    public function cards(Request $request)
    {
        return [];
    }
    public function filters(Request $request)
    {
        return [];
    }
    public function lenses(Request $request)
    {
        return [];
    }
    public function actions(Request $request)
    {
        return [];
    }
}

其主要思想是显示透视表与2个表的product_vendor连接:产品,和供应商。然后,通过一些基本的命令设置,您将能够搜索产品名称、供应商名称(或更多)和可排序(全部)。祝你好运,如果你需要,请问我!

更新:

为了修复可排序和搜索id上的错误,需要在ProductVendor Nova中做一点更改:

代码语言:javascript
复制
// indexQuery:
    public static function indexQuery(NovaRequest $request, $query)
    {
        return $query->join('vendors', 'product_vendor.vendor_id', '=', 'vendors.id')
        ->join('products', 'product_vendor.product_id', '=', 'products.id')
        ->select('product_vendor.id as temp_id','products.id as temp_product_id','vendors.id as temp_vendor_id','vendors.name as column_vendor_name','products.name as column_product_name','products.year as column_product_year','product_vendor.*','products.*','vendors.*');
    }
// $search
    public static $search = [
        'product_vendor.id','products.name','vendors.name'
    ];
// fields function
    public function fields(Request $request)
    {
        return [
            ID::make('ID','temp_id')->sortable(),
            ID::make('Vendor Id','vendor_id')
                ->sortable(),
            Text::make('Vendor Name','column_vendor_name')
                ->sortable()
                ->hideWhenCreating(),
            ID::make('Product Id','product_id')
                ->sortable(),
            Text::make('Product Name','column_product_name')
                ->sortable()
                ->hideWhenCreating(),
            Text::make('Product Year','column_product_year')
                ->sortable()

        ];
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58210629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档