2

我正在使用 laravel 背包来建立后台管理,我坚持这一点,这可能是一个非常基本的疑问。

我的情况是:

表事件:

id - name - themeID - 更多字段...

表主题:

身份证 - 姓名

所以,一个主题可以有各种事件,一个事件可以有各种主题,我对如何实现这一点有一些疑问,我做了什么:

主题.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;

class Theme extends Model
{
    use CrudTrait;

     /*
    |--------------------------------------------------------------------------
    | GLOBAL VARIABLES
    |--------------------------------------------------------------------------
    */

    protected $table = 'themes';
    //protected $primaryKey = 'id';
    // public $timestamps = false;
    // protected $guarded = ['id'];
    protected $fillable = ['name'];
    // protected $hidden = [];
    // protected $dates = [];

    /*
    |--------------------------------------------------------------------------
    | FUNCTIONS
    |--------------------------------------------------------------------------
    */

    /*
    |--------------------------------------------------------------------------
    | RELATIONS
    |--------------------------------------------------------------------------
    */

    public function Theme() {
      return $this->hasMany('App\Models\Event');
    }

    /*
    |--------------------------------------------------------------------------
    | SCOPES
    |--------------------------------------------------------------------------
    */

    /*
    |--------------------------------------------------------------------------
    | ACCESORS
    |--------------------------------------------------------------------------
    */

    /*
    |--------------------------------------------------------------------------
    | MUTATORS
    |--------------------------------------------------------------------------
    */
}

事件.php

    <?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;

class Event extends Model
{
    use CrudTrait;

     /*
    |--------------------------------------------------------------------------
    | GLOBAL VARIABLES
    |--------------------------------------------------------------------------
    */

    protected $table = 'events';
    //protected $primaryKey = 'id';
    // public $timestamps = false;
    // protected $guarded = ['id'];
    protected $fillable = ['name','theme','schedules','themeID','countyID','event_typeID','offered_conditionID','alone_with_typeID','tagID',
    'advertiserID','event_languageID','special_priceID','start_date','end_date','price','photos','space_name','address','description','facebook_url',
    'external_url1','featured_image','available_vacancies','gps_coordinates','external_url2','featured','status','start_featured_date','end_featured_date'];

    // protected $hidden = [];
    // protected $dates = [];

    /*
    |--------------------------------------------------------------------------
    | FUNCTIONS
    |--------------------------------------------------------------------------
    */

    /*
    |--------------------------------------------------------------------------
    | RELATIONS
    |--------------------------------------------------------------------------
    */

    public function Event() {
        return $this->hasOne('App\Models\EventSubType');
        return $this->hasMany('App\Models\SpecialPrice');
        return $this->hasMany('App\Models\PriceTypes');
        return $this->hasMany('App\Models\Tag');
        // return $this->hasMany('App\Models\County');
        return $this->hasMany('App\Models\County');
        return $this->hasMany('App\Models\EventHasSpecialPrice');
    }

    public function themes()
    {
        return $this->belongsToMany('App\Models\Theme');
    }

    /*
    |--------------------------------------------------------------------------
    | SCOPES
    |--------------------------------------------------------------------------
    */

    /*
    |--------------------------------------------------------------------------
    | ACCESORS
    |--------------------------------------------------------------------------
    */

    /*
    |--------------------------------------------------------------------------
    | MUTATORS
    |--------------------------------------------------------------------------
    */
}

EventCrudController.php

    <?php

namespace App\Http\Controllers\Admin;

use Backpack\CRUD\app\Http\Controllers\CrudController;

// VALIDATION: change the requests to match your own file names if you need form validation
use App\Http\Requests\EventRequest as StoreRequest;
use App\Http\Requests\EventRequest as UpdateRequest;

class EventCrudController extends CrudController
{

    public function setUp()
    {

        /*
        |--------------------------------------------------------------------------
        | BASIC CRUD INFORMATION
        |--------------------------------------------------------------------------
        */
        $this->crud->setModel('App\Models\Event');
        $this->crud->setRoute(config('backpack.base.route_prefix') . '/events');
        $this->crud->setEntityNameStrings('event', 'events');

        /*
        |--------------------------------------------------------------------------
        | BASIC CRUD INFORMATION
        |--------------------------------------------------------------------------
        */

       /* $this->crud->addColumn([
            'label' => "Theme", // Table column heading
            'type' => "select_multiple",
            'name' => 'themes', // the column that contains the ID of that connected entity;
            'entity' => 'themes', // the method that defines the relationship in your Model
            'attribute' => "name", // foreign key attribute that is shown to user
            'model' => 'App\Models\Theme', // foreign key model
            'pivot' => true,
        ]); */

        $this->crud->setFromDb();

        $this->crud->addFields([
        // This is the field im trying to get working
          [
              'label' => 'Theme',
              'type' => 'select_multiple',
              'name' => 'themeID',
              'entity'=> 'Event',
              'attribute' => 'name', // Column which user see in select box
              'model' => 'App\Models\Theme' // Model which contain FK
          ],
          [
              'label' => 'District',
              'type' => 'select2',
              'name' => 'countyID',
              'entity'=> 'district',
              'attribute' => 'name', // Column which user see in select box
              'model' => 'App\Models\District' // Model which contain FK
          ],
          [
              'label' => 'Event Type',
              'type' => 'select2',
              'name' => 'event_typeID',
              'entity'=> 'EventType',
              'attribute' => 'name', // Column which user see in select box
              'model' => 'App\Models\EventType' // Model which contain FK
          ],
          [
              'label' => 'Offered Conditions',
              'type' => 'select2',
              'name' => 'offered_conditionID',
              'entity'=> 'OfferedCondition',
              'attribute' => 'name', // Column which user see in select box
              'model' => 'App\Models\OfferedCondition' // Model which contain FK
          ],
          [
              'label' => 'Alone With Types',
              'type' => 'select2',
              'name' => 'alone_with_typeID',
              'entity'=> 'AloneWithType',
              'attribute' => 'name', // Column which user see in select box
              'model' => 'App\Models\AloneWithType' // Model which contain FK
          ],
          [
              'label' => 'Tags',
              'type' => 'select2',
              'name' => 'tagID',
              'entity'=> 'Tag',
              'attribute' => 'name', // Column which user see in select box
              'model' => 'App\Models\Tag' // Model which contain FK
          ],
          [
              'label' => 'Advertiser',
              'type' => 'select2',
              'name' => 'advertiserID',
              'entity'=> 'Advertiser',
              'attribute' => 'name', // Column which user see in select box
              'model' => 'App\Models\Advertiser' // Model which contain FK
          ],
          [
              'label' => 'Event Language',
              'type' => 'select2',
              'name' => 'event_languageID',
              'entity'=> 'Event_language',
              'attribute' => 'name', // Column which user see in select box
              'model' => 'App\Models\EventLanguage' // Model which contain FK
          ],
          [
              'label' => 'Special Price',
              'type' => 'select2',
              'name' => 'special_priceID',
              'entity'=> 'SpecialPrice',
              'attribute' => 'name', // Column which user see in select box
              'model' => 'App\Models\SpecialPrice' // Model which contain FK
        ]
        ]);

        /* $this->crud->addField([
              'label' => "Images",
              'name' => "photos",
              'type' => 'image_multiple',
              'upload' => true,
              'crop' => true, // set to true to allow cropping, false to disable
              'aspect_ratio' => 0, // ommit or set to 0 to allow any aspect ratio
          ]); */

        // $this->crud->addFields($array_of_arrays, 'update/create/both');
        // $this->crud->removeField('name', 'update/create/both');
        // $this->crud->removeFields($array_of_names, 'update/create/both');

        // ------ CRUD COLUMNS
        // $this->crud->addColumn(); // add a single column, at the end of the stack
        // $this->crud->addColumns(); // add multiple columns, at the end of the stack
        // $this->crud->removeColumn('column_name'); // remove a column from the stack
        // $this->crud->removeColumns(['column_name_1', 'column_name_2']); // remove an array of columns from the stack
        // $this->crud->setColumnDetails('column_name', ['attribute' => 'value']); // adjusts the properties of the passed in column (by name)
        // $this->crud->setColumnsDetails(['column_1', 'column_2'], ['attribute' => 'value']);

        // ------ CRUD BUTTONS
        // possible positions: 'beginning' and 'end'; defaults to 'beginning' for the 'line' stack, 'end' for the others;
        // $this->crud->addButton($stack, $name, $type, $content, $position); // add a button; possible types are: view, model_function
        // $this->crud->addButtonFromModelFunction($stack, $name, $model_function_name, $position); // add a button whose HTML is returned by a method in the CRUD model
        // $this->crud->addButtonFromView($stack, $name, $view, $position); // add a button whose HTML is in a view placed at resources\views\vendor\backpack\crud\buttons
        // $this->crud->removeButton($name);
        // $this->crud->removeButtonFromStack($name, $stack);

        // ------ CRUD ACCESS
        // $this->crud->allowAccess(['list', 'create', 'update', 'reorder', 'delete']);
        // $this->crud->denyAccess(['list', 'create', 'update', 'reorder', 'delete']);

        // ------ CRUD REORDER
        // $this->crud->enableReorder('label_name', MAX_TREE_LEVEL);
        // NOTE: you also need to do allow access to the right users: $this->crud->allowAccess('reorder');

        // ------ CRUD DETAILS ROW
        // $this->crud->enableDetailsRow();
        // NOTE: you also need to do allow access to the right users: $this->crud->allowAccess('details_row');
        // NOTE: you also need to do overwrite the showDetailsRow($id) method in your EntityCrudController to show whatever you'd like in the details row OR overwrite the views/backpack/crud/details_row.blade.php

        // ------ REVISIONS
        // You also need to use \Venturecraft\Revisionable\RevisionableTrait;
        // Please check out: https://laravel-backpack.readme.io/docs/crud#revisions
        // $this->crud->allowAccess('revisions');

        // ------ AJAX TABLE VIEW
        // Please note the drawbacks of this though:
        // - 1-n and n-n columns are not searchable
        // - date and datetime columns won't be sortable anymore
        // $this->crud->enableAjaxTable();

        // ------ DATATABLE EXPORT BUTTONS
        // Show export to PDF, CSV, XLS and Print buttons on the table view.
        // Does not work well with AJAX datatables.
        // $this->crud->enableExportButtons();

        // ------ ADVANCED QUERIES
        // $this->crud->addClause('active');
        // $this->crud->addClause('type', 'car');
        // $this->crud->addClause('where', 'name', '==', 'car');
        // $this->crud->addClause('whereName', 'car');
        // $this->crud->addClause('whereHas', 'posts', function($query) {
        //     $query->activePosts();
        // });
        // $this->crud->addClause('withoutGlobalScopes');
        // $this->crud->addClause('withoutGlobalScope', VisibleScope::class);
        // $this->crud->with(); // eager load relationships
        // $this->crud->orderBy();
        // $this->crud->groupBy();
        // $this->crud->limit();
    }

    public function store(StoreRequest $request)
       {

     /*
      // Setup storage
      $attribute_name = "photos";
      $disk = "uploads";
      $destination_path = "/uploads/projects";

        // Then get images from request
        $input = $request->all();
        $images = $input[$attribute_name];
        $imageArray = [];
        // Now iterate images
      foreach ($images as $value) {
          // Store on disk and add to array
          if (starts_with($value, 'data:image'))
          {
                // 0. Make the image
                $image = \Image::make($value);
                // 1. Generate a filename.
                $filename = md5($value.time()).'.jpg';
                // 2. Store the image on disk.
                \Storage::disk($disk)->put($destination_path.'/'.$filename, $image->stream());
                // 3. Save the path to the database
                array_push($imageArray, $destination_path.'/'.$filename);
            }
        }

        // Update $request with new array
        $request->request->set($attribute_name, $imageArray);
        */
            // Save $request
        $redirect_location = parent::storeCrud($request);
        // your additional operations after save here
        // use $this->data['entry'] or $this->crud->entry
        return $redirect_location;
    }

    public function update(UpdateRequest $request)
    {
        // Setup storage
        $attribute_name = "images";
        $disk = "uploads";
        $destination_path = "/uploads/projects";
        // Then get images from request
        $input = $request->all();
        $images = $input[$attribute_name];
        $imageArray = [];
        // Now iterate images
        foreach ($images as $value) {
            // Store on disk and add to array
            if (starts_with($value, 'data:image'))
            {
                // 0. Make the image
                $image = \Image::make($value);
                // 1. Generate a filename.
                $filename = md5($value.time()).'.jpg';
                // 2. Store the image on disk.
                \Storage::disk($disk)->put($destination_path.'/'.$filename, $image->stream());
                // 3. Save the path to the database
                array_push($imageArray, $destination_path.'/'.$filename);
            } else {
                array_push($imageArray, $value);
            }
        }
        // Update $request with new array
        $request->request->set($attribute_name, $imageArray);
        // your additional operations before save here
        $redirect_location = parent::updateCrud($request);
        // your additional operations after save here
        // use $this->data['entry'] or $this->crud->entry
        return $redirect_location;
    }

    /* public function store(StoreRequest $request)
    {
        // your additional operations before save here
        $redirect_location = parent::storeCrud();
        // your additional operations after save here
        // use $this->data['entry'] or $this->crud->entry
        return $redirect_location;
    }

    public function update(UpdateRequest $request)
    {
        // your additional operations before save here
        $redirect_location = parent::updateCrud();
        // your additional operations after save here
        // use $this->data['entry'] or $this->crud->entry
        return $redirect_location;
    } */
}

我需要数据透视表吗?我错过了什么?我发现这方面的文档很少。

我得到的错误如下:

数组到字符串的转换,他尝试保存字段 array('1','2') 并且错误发生在那里。

4

1 回答 1

1

正如@tabacitu 所解释的,您的关系是错误的。你得到了其中一个是正确的,但是每个关系都应该像下面那样定义,而不是像你所做的那样在构造方法上定义:

public function themes()
{
    return $this->belongsToMany('App\Models\Theme');
}

你可以通过阅读 Laravel 文档中关于 Eloquent Relationship找到所有你需要的信息。

完成该设置后,您就可以完成这项工作

$this->crud->addFields([
      // This is the field im trying to get working
      [
          'label' => 'Theme',
          'type' => 'select_multiple',
          'name' => 'themeID',
          'entity'=> 'themes', // <-- this is the relation method name
          'attribute' => 'name', // Column which user see in select box
          'model' => 'App\Models\Theme' // Model which contain FK
      ],
于 2018-07-23T00:14:24.773 回答