Search code examples
phpredbean

red bean php find by relation


This seems like a simple question, but I'm somehow baffled.

If I create a couple of beans with:

list($product1, $product2, $product3) = R::dispense('product', 3);
...

and a couple of categories with:

list($cat1, $cat2) = R::dispense('category', 2);
...

then link them with:

$product1->sharedCategory[] = $cat1;
$product3->sharedCategory[] = $cat1;

how do I then query all products that are related to $cat1? I should get back product 1 and 3.

Like I said, simple. In mysql this is a no-brainer, so could always just send red bean an sql string, but there must be a way of doing this built it, surely.

Thanks.


Solution

  • I think it goes the other way around (sorry if I am not right) because logically a category has many products not a product many categories as you have defined it.

    ========Edited part====================

    I deleted a small source posted here because the manual Manuall is super easy and much better and very helpful with sample code on how to connect, make association, updates etc etc. I am sure you will benefit a lot from it. If there is any difficulty with the manual glad to help.

    ========== Additional Information =======================

    Here I just put some source code, did not change anything in my answear. Try this code, it works both ways as you want it!

    <?PHP
    echo '<pre>';
    
    require('rb.php'); 
    $toolbox = R::setup('mysql:host=localhost;dbname=my_ORM','root','');
    $farm = R::dispense('building');
    
    //create the product list
    list($product1,$product2,$product3) = R::dispense('product',3);
    //add attributes 
    $product1->name='prod1';
    $product2->name='prod2';
    $product3->name='prod3';
    
    
    //create a list of categories 
    list($category1,$category2) = R::dispense('category',2);
    //add attributes 
    $category1->name='categ1';
    $category2->name='categ2';
    
    //the connect beans together
    R::associate($category1,$product1);
    R::associate($category1,$product2);
    R::associate($category1,$product3);
    R::associate($category2,$product3);
    
    //then store
    R::store($product1);
    R::store($product2);
    R::store($product3);
    R::store($category1);
    R::store($category2); 
    
    //get id for category 1
    $categId=R::getCell( " select  `id` from `category` where `name`='categ1'  ");
    //get products for category 1
    $results = 
    R::getAll( "
    SELECT  `product`.`id`,`product`.`name` 
    FROM `product`  left JOIN `category_product`
    on `category_product`.`product_id`= `product`.`id` 
    where  `category_id`='".$categId."' ");
    //display
    print_r($results);
    
    //get categories for product3
    $prodId=R::getCell( " select  `id` from `product` where `name`='prod3'  ");
    $results = 
    R::getAll( "
    SELECT  `category`.`id`,`category`.`name` 
    FROM `category`  left JOIN `category_product`
    on `category_product`.`category_id`= `category`.`id` 
    where  `product_id`='".$prodId."' ");
    print_r($results);
    
    ?>