【发布时间】: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);
}
}
我有两个问题:
是否有更简单或更简洁(不是说创建新的 obj 不干净)来访问 Order 模型方法(例如在 Codeigniter 中完成)?
我已经了解了一点关于如何在 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