gpt4 book ai didi

php - Laravel背包关系疑惑

转载 作者:行者123 更新时间:2023-11-29 03:21:13 27 4
gpt4 key购买 nike

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

我的情况是:

表事件:

id - 名称 - themeID - 更多字段...

表格主题:

id - 名字

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

Theme.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
|--------------------------------------------------------------------------
*/
}

Event.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')上,错误发生在那里。

最佳答案

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

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

阅读有关 Eloquent Relationship 的 Laravel 文档,您可以找到所需的所有信息。 .

一旦你有了这个设置,你就可以让它工作了

$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
],

关于php - Laravel背包关系疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44704525/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com