콜렉션 모델 및 자원 모델 정보


29

리소스 모델 및 컬렉션 모델 사용에 대해 약간 혼란 스럽습니다. 때로는 특정 속성을 사용하여 제품을로드하는 예제를 볼 때 일부 예제에서는 콜렉션 모델을 사용하고 때로는 자원 모델을 사용합니다.

또한 특정 방법 get...set...테이블 행 이름을 언제 사용할 수 있습니까? 마찬가지로 getName, getId. 사용하려고했지만 값을 가져올 수 없으며 "객체에서 정의되지 않은 메소드 호출"오류가 표시됩니다.

$product = Mage::getModel('catalog/product')
    ->loadByAttribute('name', 'product_name');

echo $product->getName(); 
echo $product->getSku();

"정의되지 않은 방법 getSku()"을 보여줍니다

를 사용 var_dump($product)하면 SKU가 객체에 표시되지만 다음을 사용하여 SKU를 가져올 수 없습니다 getSku()...


명확하게 설명하자면 , Magento 용어에서 "모델"인의 $product인스턴스가 Mage_Catalog_Model_Product있습니다.
benmarks

네, 그러죠. 그러나 컬렉션 모델과 리소스 모델을 사용할 때와 사용할 수있는 방법이 무엇인지 혼란 스럽습니다. 모듈의 Model >> collection 폴더에서 콜렉션 모델을 사용할 수 있고 자원 모델에서는 자원을 사용할 수 있지만 언제 어떤 모델을 사용
해야하는지

우리는 수집 및 아웃소싱에서 사용할 수있는 사용 가능한 방법을 사용해야한다는 것을 알고 있습니다. 그러나 올바른 모델을 사용하기가 어렵습니다. 또한 "Get"메소드를 사용하여 결과 세트에서 결과를 얻을 수 없습니다. 데이터베이스 테이블 행 이름을 사용하는 getName ()을 의미합니다. 그것은 객체에 정의되지 않은 메소드를 보여줍니다. 사용해야하는 잘못된 모델이나 메소드에 액세스하고 있기 때문에 사용해야하는 것에 대해 혼란스럽지 않습니다.
MagentoBoy 2016 년

1
이 질문을 해주셔서 감사합니다 ..이 질문에 대한 답을 오랫동안 찾고있었습니다 .. +1 ..
Elavarasan

답변:


63

마젠 토의 CRUD 모델에는 세 가지 기본 클래스 유형이 있습니다.

"모델"은 가장 일반적으로 사용되는 것입니다. 데이터베이스 유형에 관계없이 특정 유형의 데이터를 나타냅니다 (제품, 카테고리, CMS 페이지, 검토 등).

"자원 모델"은 무대 뒤에서 Magento에서 데이터를 실제로 가져 오는 클래스입니다. 모든 모델 에는 데이터베이스에서 모델 의 단일 인스턴스를로드하는 데 사용되는 자원 모델 이 있습니다.

"컬렉션"은 일련의 규칙에 따라 여러 모델의 구조와 같은 배열을로드하는 클래스입니다. SQL처럼 생각하십시오 WHERE clause.

어느 정도 일을 혼동하는 장면 뒤에, 마 젠토가있다 또한 자원 모델로 컬렉션을 고려한다. 그래서 거기에 수집 자원 모델개별 자원 모델을 .

일반적으로 특정 항목을로드하려는 경우 model 을 사용합니다 . 여러 항목을로드하려면 콜렉션 자원 모델 을 사용하십시오 .

//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 자원 모델 클래스는 일반적으로 직접 액세스 할 수 없습니다. 그러나 때때로 특정 모델 에는 유용한 방법 이있는 자원 모델이 있습니다. 이것들은 시스템을 사용하여 시간이 지남에 따라 발견됩니다.

마지막으로 한 가지 더 구별해야합니다. Magento의 일반 CRUD 모델에는 숫자 ID가 아닌 것을 통해로드하기위한 특별한 구문이 있습니다. 예를 들어 제목별로 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');

특정 문제와 관련하여 특정 텍스트 "method undefined"에 오류가 발생하면 시스템에 문제가있는 것입니다. 이 getSku메소드가 존재하지 않더라도 Magento에는 get모든 모델 에 대한 호출 이 null 인 경우에도 항상 무언가를 반환 하도록하는 매직 세터 및 게터 메소드가 있습니다.

다음과 같은 오류가 발생했을 가능성이 큽니다.

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()방법을 확인하십시오. 모든 객체 데이터의 배열을 배열로 반환합니다.

잘만되면 이것이 당신을 움직 이기에 충분합니다. 행운을 빕니다!


@ Alan .. 아주 좋은 설명 ... 나는 Magento에 대한 귀하의 게시물을 많이 읽었습니다 :) .. 내 게시물에 대한 귀하의 답변을 본 후 너무 행복합니다. 나는 당신의 정보를 앞으로 나아갈 것입니다. 문제가 생기면이 커뮤니티에서 좋은 지원을 받으시기 바랍니다. 마 젠토와 포 그래밍을 처음 접했을 때 내 질문은 그리 개념적이지 않지만 여전히 배우고 싶습니다. 나는 정말 마
젠토

죄송합니다. 질문이 하나 더 있습니다. $ product = Mage :: getModel ( 'catalog / product'); 그런 다음 getName () 및 getSku ()를 호출하면 foreachloop에서 $ product를 반복하면 값을 얻을 수 있습니까? 또는 loadByAttribute () 메소드를 호출해야합니까 ??
MagentoBoy 2016 년

@MagentoBoy 사과하지만 언어 장벽이 질문을 가리는 것 같습니다. 당신이 무엇을 요구하는지 잘 모르겠습니다.
Alan Storm

죄송합니다. 흥분해서 나는 내 질문을 명확하게 표현하지 않았다. 그러나 나는 시도했고 지금은 제품 목록을 얻을 수 있으며 이제 다른 속성을 사용하여 제품을 가져올 수 있습니다. :) 그리고 내 질문은 addAttributeToSelect ( '*'), addAttributeToFilter () 또는 loadByAttribute ()를 호출하지 않고 getName (), getPrice (), getSku ()와 같은 get 메소드를 사용할 수 있습니까? 예를 들어. $ product = Mage :: getModel ( '카탈로그 / 제품'); foreach ($ product as $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... get 모델이 제품 클래스를 인스턴스화하면 액세스 get 및 set 메소드에 액세스 할 수 있습니다. .
MagentoBoy 2016 년

1
@ user8009이 오류 메시지는 수많은 이유로 발생할 수 있습니다. FTP 액세스 권한을 얻지 못하거나 시스템의 로컬 / 개발 버전에서 문제를 재현하면 문제를 해결할 수 없습니다.
Alan Storm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.