Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php DataMapperORM-如何获取所有模型和每个实例的相关数据_Php_Codeigniter_Orm_Codeigniter Datamapper - Fatal编程技术网

Php DataMapperORM-如何获取所有模型和每个实例的相关数据

Php DataMapperORM-如何获取所有模型和每个实例的相关数据,php,codeigniter,orm,codeigniter-datamapper,Php,Codeigniter,Orm,Codeigniter Datamapper,我不明白如何做到以下几点: 假设我有一张产品表和一张照片表。1产品有很多照片。因此,在产品模型中,我会: var $has_many = array("category", "photo"); 现在,我想得到所有的产品,并将他们的每一张照片与他们联系起来。我该怎么做?目前,在我的控制器中,我正在浏览每个产品,查询照片,并以这种方式传递一个单独的数组。这并不理想。我应该能够把每张照片直接系到特定的产品上没有 从逻辑上讲,这是可行的,但事实并非如此 $product = new Product;

我不明白如何做到以下几点:

假设我有一张产品表和一张照片表。1产品有很多照片。因此,在产品模型中,我会:

var $has_many = array("category", "photo");
现在,我想得到所有的产品,并将他们的每一张照片与他们联系起来。我该怎么做?目前,在我的控制器中,我正在浏览每个产品,查询照片,并以这种方式传递一个单独的数组。这并不理想。我应该能够把每张照片直接系到特定的产品上没有

从逻辑上讲,这是可行的,但事实并非如此

$product = new Product;
$products = $product->get_by_related_category('name', $where);
$photos = $product->photo->get();
明白我的意思了吗?我希望将$products变量传递给我的视图,能够通过它进行foreach,并将一组照片绑定到每个产品对象

我怎样才能做到这一点?还是有更好的方法


谢谢

对于具有多个关系的数据库,您基本上有两种方法可以使用SQL获取相关信息:

您可以在products.id=photos.product\u id上的products left外部联接photos中联接其他表,如select products.*、photos.*。这样,您将拥有重复的产品数据,因此需要相应地处理结果。不幸的是,它不直接支持这一点,它会创建重复的产品,其中每个产品在您的案例中都有一张相关的照片

您可以运行两个查询,首先从products中获取products select*,其中。。。然后获取带有所选产品id的照片,从产品id所在的照片中选择*。。。并整理出哪些照片行应该去哪些产品。DMZ中没有内置的功能,但下面是我为扩展DataMapper类的模型基类编写的代码,该类可以像这样使用:

$products = new Product;
$products = $products
    ->get_by_related_category('name', $where) // first get the parent objects
    ->load_related('photo'); // then load in the related ones inside them
foreach ($products as $product) {
    // unique product instances as before
    foreach ($product->photo as $photo) {
        // and every product has a list of related photos 
        // for each product individualy
    }
}
下面的方法将收集父对象的id,在where_in中使用id运行一个SQL查询,并对父对象的相关字段对象的结果进行排序。不幸的是,它有点长,不支持多对多关系


我现在正在探索DM,我需要同样的功能。起初,另一个答案中与load_相关的函数似乎就是解决这个问题的方法。 不过我做了一些进一步的研究。我找到了另一个问题的答案,这让我思考,如果没有一种方法可以自动填充一些关系。 嗯,有

如果在模型中建立关系,则可以设置此“选项”

//Instead of doing this:
var $has_many = array('user_picture');

//Do this
var $has_many = array(
    'user_picture' => array(
        'auto_populate' => TRUE,
    ),
 );
现在,图片将在用户对象中可用

foreach ($u as $user) {

    foreach ($user->user_picture as $picture) {
        // Do your thing with the pictures
    }

}
我在文件上找到的


享受吧

我想我找到了一个更好的解决方案,它也适用于多对多关系。@Brainfeeder,你让我好奇,你发现了什么?检查我发布的答案:但是,如果你有大量相关对象,你的解决方案可能会更好。我现在的做法是在你需要或不需要的时候加载它们。。。但对于我需要的数据,它是好的。
foreach ($u as $user) {

    foreach ($user->user_picture as $picture) {
        // Do your thing with the pictures
    }

}