lenny.myr
lenny.myr

Reputation: 913

CakePHP hasOne relationship with different table

Each Artikel has exactly one Barcode. For several reasons I want to split the Artikel model and the Barcode model. When I find() something from the artikel table it returns an array which contains the correct barcode section. But when I try to find a barcode, the array's artikel section is nulled.

This is what I mean:

// $this->Artikel->findById(102);
array(
    'Artikel' => array(
        'id' => '102',
        'name' => 'Spätburgunder Spätlese Barrique',
        'erzeuger_id' => '679',
        'volumen_id' => '44',
        'artikelgruppe_id' => '17'
    ),
    'Barcode' => array(
        'id' => '1',
        'artikel_id' => '102',
        'barcode' => '123456'
    )
)

// $this->Barcode->findByBarcode(123456);
array(
    'Barcode' => array(
        'id' => '1',
        'artikelnummer' => 'DE51076',
        'barcode' => '123456'
    ),
    'Artikel' => array(
        'artikelnummer' => null, // this is null
        'name' => null, // this is null as well
        'erzeuger_id' => null, // also null
        'volumen_id' => null, // ……
        'artikelgruppe_id' => null // null
    )
)

Any ideas what I did wrong?

These are the models

// Barcode.php
public $hasOne = array(
    'Artikel' => array(
        'className' => 'Artikel',
        'foreignKey' => 'artikel_id'
    )
);


// Artikel.php
public $hasOne = array(
    'Barcode' => array(
        'className' => 'Barcode',
        'foreignKey' => 'artikel_id'
    )
);

Upvotes: 0

Views: 217

Answers (2)

Ananth
Ananth

Reputation: 4397

Article table - id, name, artikelgruppe_id and Barcode table - id, artikel_id, barcode

The correct way to relate these models is: Article hasOne Barcode and Barcode belongsTo Article

// Artikel.php
public $hasOne = array(
    'Barcode' => array(
        'className' => 'Barcode',
        'foreignKey' => 'artikel_id'
    )
);

// Barcode.php
public $belongsTo = array(
    'Artikel' => array(
        'className' => 'Artikel',
        'foreignKey' => 'artikel_id'
    )
);

Here article_id is in the Barcode table, so Article hasOne Barcode works as expected. Barcode hasOne Article would have worked if you had a barcode_id in your Article table.

But since you need the article from article_id field in Barcode table, you should use belongsTo relationship.

Upvotes: 3

Yerko Palma
Yerko Palma

Reputation: 12329

From what controller are you making those callings? If you are on the same model then is wrong because you must do the call through the references between the models. For example, I asume that you are in the Artikel model, so your first call is right, but the second one should be $this->Artikel->Barcode->findById(1)

Upvotes: -1

Related Questions