0

我在 Kohana ORM 中加载对象子项时遇到问题。
我的数据库表看起来:

-objects (something like "houses", but objects sounds better in my opinion)
  -id
  -name
  -title
  -author
  -city (id link to cities.city_id)
  -description
  -access
-cities
  -city_id
  -country (id link to countries.country_name)
  -city_name
-countries
  -country_id
  -country_name

和我的模型:

class Model_Object extends ORM
{
    protected $_table_name = 'objects';
    protected $_table_columns = array(
        'id' => NULL,'name' => NULL,
        'title' => NULL,
        'author' => NULL,
        'city' => NULL,
        'description' => NULL,
        'access' => NULL,
        'created' => NULL
    );
    protected $_primary_key = 'id';
    protected $_has_one = array(
        'city'=>array(),
        'author'=>array(
            'model'=>'User',
            'foreign_key'=>'user_id',
        )
    );
}

class Model_City extends ORM
{
    protected $_table_name = 'cities';
    protected $_table_columns = array('city_id'=>NULL,'city_name'=>NULL);
    protected $_primary_key = 'city_id';
    protected $_has_one = array('country'=>array(
        'model'=>'country',
        'foreign_key'=>'country',
    ));
    protected $_belongs_to = array(
        'objects'=>array(),
    );
}

class Model_Country extends ORM
{
    protected $_table_name = 'countries';
    protected $_table_columns = array(
        'country_id'=>NULL,
        'country_name'=>NULL,
    );
    protected $_primary_key = 'country_id';
    protected $_belongs_to = array(
        'cities'=>array(
            'model'       => 'city',
            'foreign_key' => 'country'
        ),
    );
}

我需要获取对象的对象,包括国家和城市的名称。我找到了这个:

ORM::factory('Object')->with('City')->with('City:Country')->find_all();

在这里,但它返回城市 ID 而不是城市对象。
所以我的问题是:如何在我呈现的表格中获取带有子对象的对象对象?

4

1 回答 1

0

您可以通过这种方式查看正在执行的查询:

echo View::factory('profiler/stats');

我相信主要问题是你的关系。带有城市和城市:国家的 find_all 对象看起来不错。

您可能要考虑的是遵循 Kohana ORM 命名约定。所以这些表将是对象、城市和国家,它们都将 id 作为它们的主键。对象表将有一个 city_id 列(指城市表中的 id),城市将有 country_id 将“指向”国家表中的 id 列。如果您保持表、列和模型的名称正确,您甚至不需要在模型中单独定义表名或外键。

现在,由于每个对象都有一个分配给它的城市,并且每个城市可能有零到 n 个对象,您想在对象模型中声明它属于城市。在城市模型中使用有很多对象。

城市也属于国家,国家有许多城市。

现在您应该能够获取如下数据:

$objects = ORM::factory('Object')->with('City')->with('City:Country')->find_all();

$objects = $cityObject->objects->find_all();

$cities = $countryObject->cities->find_all();

等等

更多关于关系的信息可以在这里找到

于 2014-02-04T17:51:15.197 回答