无法弄清楚如何将表与php活动记录关联起来

时间:2014-07-21 14:42:34

标签: php activerecord phpactiverecord

我必须遗漏一些重要的东西,但我无法解决这个问题 我想将许多地址与一个人联系起来......所以我们在这里解决我的问题: 有人帮忙吗?

CREATE TABLE `testpersons` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

CREATE TABLE `testaddresses` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

CREATE TABLE `testassociate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `testuser_id` int(11) NOT NULL,
  `testgroup_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

然后我创建我的对象:

class Testperson extends ActiveRecord\Model {
    static $table_name = 'testpersons';
    static $has_many = array(
        array('testaddress',
            'through'=>'test_associate',
            'foreign_key'=>'testgroup_id',
            'primary_key'=>'testuser_id',
            'class_name'=>'Testaddress')
    );
}

class Testaddress extends ActiveRecord\Model {
    static $table_name = 'addresses';
    static $belongs_to = array(
        array('testperson',
            'through'=>'test_associate',
            'foreign_key'=>'testuser_id',
            'primary_key'=>'testgroup_id')
        );
}

然后尝试获得我的结果:     $ person = Testperson :: find(2);     echo var_dump($ person);

给出:

object(Testperson)[16]
   public 'errors' => null
  private 'attributes' (ActiveRecord\Model) => 
   array (size=2)
  'id' => int 2
  'name' => string 'tata' (length=4)
  private '__dirty' (ActiveRecord\Model) => 
  array (size=0)
  empty
  private '__readonly' (ActiveRecord\Model) => boolean false
private '__relationships' (ActiveRecord\Model) => 
 array (size=0)
   empty
private '__new_record' (ActiveRecord\Model) => boolean false

有人可以告诉我我的协会有什么问题吗? 很多thx

1 个答案:

答案 0 :(得分:1)

如果你想做的就是将许多Address与一个Person相关联,那么你的数据库结构是错误的并且不必要地复杂。
你想要的是这个:

CREATE TABLE `testpeople` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
   PRIMARY KEY (`id`)
);

CREATE TABLE `testaddresses` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `testperson_id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
);

现在您的模型将是这样的:

class Testaddress extends ActiveRecord\Model {
    static $belongs_to = array(
        array('testperson')
    );
}

class Testperson extends ActiveRecord\Model {
    static $table_name = 'testpeople';

    static $has_many = array(
        array('testaddress')
    );
}

这应该足够了。

但是,当您想要使用through时,您还应该拥有具有相应关系的中间表的模型。
例如,我将使用您的数据库结构。

class Testperson extends ActiveRecord\Model {
    static $table_name = 'testpeople';

    static $has_many = array(
        array('testassociate', 'foreign_key' => 'testuser_id'),
        array('testaddress', 'through' => 'testassociate', 'foreign_key' => 'testgroup_id')
    );
}

class Testassociate extends ActiveRecord\Model {
    static $belongs_to = array(
        array('testperson', 'foreign_key' => 'testuser_id'),
        array('testaddress', 'foreign_key' => 'testgroup_id'),
    );
}

class Testaddress extends ActiveRecord\Model {
    static $has_one = array(
        array('testassociate', 'foreign_key' => 'testgroup_id'),
        array('testaddress', 'through' => 'testassociate', 'foreign_key' => 'testuser_id'),
    );
}

关于空__relathionships,因为它是一个缓存变量,当您请求某种关系时会填充该变量,例如$person->testaddresses