monurakkaya / opencart-eloquent
OpenCart模型的Eloquent支持
Requires
- php: >=7.0
- illuminate/database: ^5.8
- illuminate/pagination: ^5.8
- illuminate/support: ^5.8
Requires (Dev)
- symfony/var-dumper: ^5.3
README
为懒惰的Laravel开发者提供的另一个OpenCart数据库包。我编写了这个包来与我的OpenCart扩展一起使用。它不会用Eloquent模型完全替换整个OpenCart模型。它只是在你查询时给你使用Eloquent ORM灵活性的机会。
安装
- 首先,通过composer安装此包
composer require monurakkaya/opencart-eloquent
- 然后将ocmod文件复制到您的系统目录
cp storage/vendor/monurakkaya/opencart-eloquent/src/*.xml upload/system
- 进入您的管理面板并刷新修改。
示例
要获取包含产品的类别的数量,只需键入
use App\Models\Catalog\Category\Category; $categories_count = Category::whereHas('products')->count();
要获取带有产品数量的类别,只需键入
use App\Models\Catalog\Category\Category; $categories = Category::withCount('products')->get(); echo $categories->first()->products_count // 5 echo $categories->first()->description->name // Electronics
选项和值
use App\Models\Catalog\Option\Option; $options = Option::with('description', 'values.description')->get(); foreach ($options as $option) { echo $option->description->name; // Color foreach ($option->values as $value) { $value->description->name; // Dark } }
那么产品选项和选项值怎么办呢?
use App\Models\Catalog\Product\Product; $product = Product::with('options.values')->find(5); foreach($product->options as $option) { echo $option->option->description->name; // Color foreach ($option->values as $value) { $value->value->description->name; // Grey } } // Be careful about (N+1) which opencart doesn't care at all...
分页
use App\Models\Catalog\Manufacturer\Manufacturer; $manufacturers = Manufacturer::with('description') ->paginate( $this->config->get('config_limit_admin'), ['*'], 'page', $this->request->get['page'] ); //below lines belongs to opencart logic. $pagination = new \Pagination(); $pagination->total = $manufacturers->total(); $pagination->page = $manufacturers->currentPage(); $pagination->limit = $this->config->get('config_limit_admin'); $pagination->url = $this->url->link('extension/module/some_of_my_extensions/manufacturer', 'user_token=' . $this->session->data['user_token']. '&page={page}', true); $pagination = $pagination->render(); $this->response->setOutput($this->load->view('extension/module/some_of_my_extensions', compact('manufacturers', 'pagination')))
简单吧? :)
只要我继续使用OpenCart,这个项目就会得到维护。
编写您的扩展模型
只需将您的模型放入您的上传/app目录。推荐的方式是遵循OpenCart目录结构,例如
upload/admin/controller/extension/module/product_video.php
upload/admin/view/template/extension/module/product_video.twig
upload/app/Models/Extension/Module/ProductVideo.php
<?php namespace App\Models\Extension\Module use App\Models\Model; use App\Models\Catalog\Product\Product; class ProductVideo extends Model { private $table = DB_PREFIX.'product_video'; private $primaryKey = 'product_video_id'; public function product() { return $this->belongsTo(Product::class, 'product_id') } }
然后在您的模块控制器中调用
use App\Models\Extension\Module\ProductVideo; $video = ProductVideo::with('product')->first(); $video->product // Product object
OCMOD支持
您可以轻松修改原始模型文件,而无需触碰任何供应商文件。
每个模型在开头都有注释行//trait
,在结尾有//ocmod
。只需搜索并添加您想要的任何内容。
以下代码可以让你使用name属性作为修饰符,所以你就可以使用$product->name
代替$product->description->name
。
<file path="app/Models/Catalog/Product/Product.php"> <operation> <search><![CDATA[//ocmod]]></search> <add position="after"> <![CDATA[ public function getNameAttribute() { return $this->description->name; } ]]> </add> </operation> </file>
结果
$product->description->name // Ibanez RG35EX Black
$product->name // Ibanez RG35EX Black
以下代码可以让你使用修饰符进行修改。
<?php namespace App\Traits\Extension\Payment\MyModule\Traits\HasPrice; trait HasPrice { public function getDiscountedPrice($percent = 20) { return $this->price * (100 - $percent) / 100; } }
<file path="app/Models/Catalog/Product/Product.php"> <operation> <search><![CDATA[//trait]]></search> <add position="after"> <![CDATA[ use \App\Traits\Extension\Payment\MyModule\Traits\HasPrice; ]]> </add> </operation> </file>
结果
$product->price // 50
$product->getDiscountedPrice() // 40
$product->getDiscountedPrice(10) // 45
以下代码可以在OpenCart产品模型和您的扩展模型之间创建关系。
<file path="app/Models/Catalog/Product/Product.php"> <operation> <search><![CDATA[//ocmod]]></search> <add position="after"> <![CDATA[ public function videos() { return $this->hasMany(\App\Models\Extension\Module\ProductVideo::class, 'product_id', 'product_id'); } ]]> </add> </operation> </file>
结果
$product = Product::with('videos')->first();
$product->videos->first(); // Video model
修改文件将存储到storage/modification/app/Models/Product/Product.php
。