monurakkaya/opencart-eloquent

OpenCart模型的Eloquent支持

安装: 225

依赖: 0

建议者: 0

安全: 0

星标: 5

关注者: 3

分支: 3

开放问题: 0

类型:项目

v0.0.5 2021-09-05 15:22 UTC

This package is auto-updated.

Last update: 2024-09-05 22:27:25 UTC


README

为懒惰的Laravel开发者提供的另一个OpenCart数据库包。我编写了这个包来与我的OpenCart扩展一起使用。它不会用Eloquent模型完全替换整个OpenCart模型。它只是在你查询时给你使用Eloquent ORM灵活性的机会。

安装

  1. 首先,通过composer安装此包
composer require monurakkaya/opencart-eloquent
  1. 然后将ocmod文件复制到您的系统目录
cp storage/vendor/monurakkaya/opencart-eloquent/src/*.xml upload/system
  1. 进入您的管理面板并刷新修改。

示例

要获取包含产品的类别的数量,只需键入

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