โมเดล CRUD ของวีโอไอพีมีสามประเภทคลาสพื้นฐาน
"แบบจำลอง" คือสิ่งที่คุณใช้บ่อยที่สุด ข้อมูลนี้แสดงถึงประเภทของประเภทใดประเภทหนึ่งในวิธีไม่เชื่อเรื่องฐานข้อมูล (ผลิตภัณฑ์, หมวดหมู่, หน้า CMS, รีวิว ฯลฯ )
"โมเดลทรัพยากร" เป็นคลาสที่อยู่เบื้องหลังการดึงข้อมูลจริงจาก Magento ทุกโมเดลมีโมเดลรีซอร์สที่ใช้เพื่อโหลดอินสแตนซ์เดียวของโมเดลจากฐานข้อมูล
"คอลเลกชัน" เป็นคลาสที่โหลดอาร์เรย์เช่นโครงสร้างของหลายรุ่นตามชุดของกฎ WHERE clause
คิดว่ามันเหมือนของ SQL
ค่อนข้างสับสนอยู่เบื้องหลัง Magento ยังถือว่าคอลเลกชันเป็นแบบจำลองทรัพยากร ดังนั้นจึงมีรุ่นทรัพยากรคอลเลกชันและรุ่นทรัพยากรบุคคล
โดยทั่วไปเมื่อคุณต้องการโหลดเฉพาะรายการที่คุณใช้รูปแบบ เมื่อคุณต้องการโหลดจำนวนของรายการที่คุณใช้รีซอร์สโมเดลคอลเลกชัน
//loads one
$product = Mage::getModel('catalog/product')->load($id);
//loads many products where price is greater than 100
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*') //load all fields, see EAV below
->addAttributeToFilter('price', array('gt'=>'100'));
foreach($products as $product)
{
var_dump($product->getSku());
}
สิ่งหนึ่งที่ต้องคำนึงถึงเกี่ยวกับการโหลดผ่านโมเดลทรัพยากรคอลเลกชันคือวิธีการของ แต่ละรุ่นafterLoad
จะไม่ถูกเรียกโดยอัตโนมัติซึ่งหมายความว่าข้อมูลบางอย่างอาจไม่สามารถโหลดได้
รุ่นทรัพยากร individuaเรียนมักจะไม่เข้าถึงได้โดยตรง อย่างไรก็ตามในบางครั้งรูปแบบที่เฉพาะเจาะจงจะมีรูปแบบทรัพยากรที่มีวิธีการที่เป็นประโยชน์ สิ่งเหล่านี้คุณจะค้นพบเมื่อเวลาผ่านไปโดยใช้ระบบ
ในที่สุดก็มีอีกหนึ่งความแตกต่างที่จะทำ โมเดล CRUD ปกติของ Magento มีไวยากรณ์พิเศษสำหรับการโหลดผ่านสิ่งที่ไม่ใช่รหัสตัวเลข ตัวอย่างเช่นต่อไปนี้เป็นวิธีโหลดโมเดลหน้า CMS ตามชื่อเรื่อง
$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());
อย่างไรก็ตาม Magento บางรุ่นเป็นรุ่น EAV นั่นหมายถึง "ค่าแอตทริบิวต์เอนทิตี" และเป็นวิธีแฟนซีในการพูดแบบจำลองเหล่านี้ไม่มีชุดของฟิลด์ที่แน่นอน ซึ่งรวมถึงรุ่นผลิตภัณฑ์และรุ่นหมวดหมู่ คุณลักษณะนี้เป็นสิ่งที่ช่วยให้คุณเลือกคุณลักษณะที่แตกต่างกันสำหรับผลิตภัณฑ์ประเภทต่างๆ แต่ละฟิลด์ในโมเดล EAV นั้นรู้จักกันในชื่อแอตทริบิวต์ ไวยากรณ์ข้างต้นไม่สามารถใช้ได้กับรุ่นเหล่านี้ แต่คุณต้องใช้loadByAttribute
วิธีนี้แทน
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');
เกี่ยวกับปัญหาเฉพาะของคุณหากคุณได้รับข้อผิดพลาดด้วยข้อความ "เมธอดไม่ได้กำหนด" โดยเฉพาะแสดงว่ามีบางอย่างผิดปกติกับระบบของคุณ แม้ว่าgetSku
จะไม่มีวิธีการอยู่ แต่ Magento ก็มีวิธีตั้งค่าแบบเวทและทะเยอทะยานซึ่งทำให้มั่นใจได้ว่าการget
โทรไปที่รุ่นใด ๆจะส่งคืนบางสิ่งอยู่เสมอแม้ว่าจะเป็นโมฆะก็ตาม
มีโอกาสมากขึ้นที่คุณจะได้รับข้อผิดพลาดดังนี้
Call to a member function getSku() on a non-object
ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากloadByAttribute
วิธีการส่งคืนfalse
หากไม่สามารถโหลดวัตถุ
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false
ลองอะไรแบบนี้ในรหัสของคุณ
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'sku-value');
if($product)
{
var_dump($product->getName());
var_dump($product->getSku());
var_dump($product->getData());
}
else
{
var_dump("Could not load product");
}
นอกเหนือจากเงื่อนไขให้สังเกตgetData()
วิธีการ นี่จะส่งคืนอาร์เรย์ของข้อมูลทั้งหมดของวัตถุเป็นอาร์เรย์
หวังว่านี่จะเพียงพอที่จะทำให้คุณเคลื่อนไหวได้ โชคดี!
$product
ในตัวอย่างของคุณเป็นตัวอย่างของMage_Catalog_Model_Product
ซึ่งเป็น "รูปแบบ" ในวีโอไอพีสำนวน