【问题标题】:Model access in Laravel > 5Laravel 中的模型访问 > 5
【发布时间】:2018-03-16 22:18:54
【问题描述】:

首先,我是 Laravel 的新手。我来自 Codeigniter,在那里你可以有类似的东西:

class Test_Model extends CI_Model {

   public function test_method($a, $b){
      return $a * $b;
   }
}

class Test_Controller extends CI_Controller {

   public function __construct(){
        $this->load->model('Test');
   }

   public function method1() {
        $z = $this->Test->test_method(3,4);
   }
}

如您所见,模型已加载,并且所有方法都可用。在我看来,这很简单。

现在,我在 Laravel 中有以下内容:

namespace App;

use Illuminate\Database\Eloquent\Model;

// Order Model
class Order extends Model
{
    protected $fillable = ['user_id'];

    public function orderItems()
    {
        return $this->hasMany(orderItem::class);
    }
}



// orderItem model
namespace App;
use Illuminate\Database\Eloquent\Model;
class orderItem extends Model
{
    protected $fillable = [
        'order_id',
        'item_id',
        'type',
        'quantity',
        'price',
        'subtotal'
    ];

    public function order()
    {
        return $this->belongsTo(Order::class);
    }
}


// Orders Controller
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Order;
use App\orderItem;
class OrdersController extends Controller
{
    private $orderId;

    public function store(Request $request)
    {
        // check if there's already a cart [order] for this user, if not create one
        $this->orderId = Order::where('user_id', $request->json('user_id'))->get(['id']);
        $item = [
            'item_id' => $request->json('item_id'),
            'type' => $request->json('type'),
            'quantity' => $request->json('quantity'),
            'price' => $request->json('price'),
        ];

        if (!$this->orderId->count()){
            $this->orderId = Order::insertGetId([
                'user_id' => $request->json('user_id')
            ]);
        }

        $orderItem = new Order();
        $orderItem->addOrderItem($item, $this->orderId);
    }
}

我有两个问题:

  1. 是否有更简单或更简洁(不是说创建新的 obj 不干净)来访问 Order 模型方法(例如在 Codeigniter 中完成)?

  2. 我已经了解了一点关于如何在 Laravel 中建立模型之间的关系。我还有另外两个分别名为 Record 和 Artist 的表(一对多的关系),我可以执行以下操作:

$record = Record::findOrFail($id); $record['artist_name'] = $record->artist->name;

但是当我尝试对 Order 和 orderItem(也是一对多的关系)执行相同操作时,它不起作用:

$cart = Order::where('user_id', $user->id)->get();

    // Retrieve existing items in cart
    $cart_items = $cart->orderItems();

这是为什么呢?

【问题讨论】:

  • 您希望如何在不创建对象的情况下访问模型方法?
  • 至于问题1。您可以创建一个静态方法。但绝不是那种简洁的设计,因为该方法与实际模型本身无关。您发布的 Codeigniter 方法也没有。

标签: php laravel model-view-controller


【解决方案1】:

关于问题1:

如果该方法与模型的实际实例无关,我强烈建议不要将它放在模型上。您可以创建一个不扩展 Model 类的单独类,因为没有必要。

如果你真的想要,你可以创建一个static 方法。

如果它确实依赖于模型(数据库行),则无法不实例化它,因为它需要知道要处理哪个数据库行。

关于问题2:

这部分$cart_items = $cart->orderItems(); 仅返回一个查询构建器(因为您将其作为函数而不是属性来调用)。这使您可以将其他查询构建器方法链接起来。

例如$cart_items = $cart->orderItems()->get(); 将返回实际订单商品。

或者您可以将其作为属性调用并获得相同的结果:

$cart_items = $cart->orderItems;

虽然上述方法应该有效,但通常建议您使用eager load 关系(尤其是当您拉动父模型的多行时),看起来像这样(->with() 部分将急切加载它们):

$cart = Order::where('user_id', $user->id)->with('orderItems')->get();
$cart_items = $cart->orderItems;

【讨论】:

    猜你喜欢
    • 2018-11-06
    • 2015-08-11
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    相关资源
    最近更新 更多