【问题标题】:YII Active Record JoinYII Active Record 加入
【发布时间】:2012-04-13 14:24:09
【问题描述】:

我是第一天看 YII,但我在尝试找出一些表之间的关系时遇到了一些问题。

我的表结构如下:

宠物: pet_id 宠物名 ....

Pet_Owner_Link pet_id owner_id

所有者: owner_id 所有者名称

我将如何获得属于所有者的所有宠物?目前真的很难理解 AR 关系。

【问题讨论】:

标签: php activerecord yii many-to-many


【解决方案1】:

根据 DD.Jarod 在 Yii AR 文档页面上的评论:http://www.yiiframework.com/doc/guide/1.1/en/database.arr#c970

"如果声明多对多关系,可连接声明中键的顺序必须是'my_id, other_id':

class Post extends CActiveRecord
{
  public function relations()
  {
    return array(
        'categories'=>array(self::MANY_MANY, 'Category',
            'tbl_post_category(post_id, category_id)'),
    );
  }
}
class Category extends CActiveRecord
{
  public function relations()
  {
    return array(
        'Posts'=>array(self::MANY_MANY, 'Post',
            'tbl_post_category(category_id, post_id)'),
    );
  }
}

所以你的代码看起来像:

class Owner extends CActiveRecord
{
  public function relations()
  {
    return array(
        'pets'=>array(self::MANY_MANY, 'Pet',
            'tbl_post_category(pet_id, owner_id)'),
    );
  }
}
class Pet extends CActiveRecord
{
  public function relations()
  {
    return array(
        'owners'=>array(self::MANY_MANY, 'Post',
            'tbl_post_category(owner_id, pet_id)'),
    );
  }
}

您的问题可能是默认情况下 Pet 和 Owner 的主键应该是 id(不是 pet_id / owner_id)。如果您不明确说明您的主键与默认命名约定不匹配/没有设置为数据库中的主键,Yii 可能会感到困惑。您可以在这样的模型中指定主键:

public function primaryKey()
{
    return 'owner_id';
}

最后,你会像这样检索信息:

$owner = Owner::model()->findByPk((int)$id);
foreach($owner->pets as $pet)
{
    print $pet->name;
}

【讨论】:

    【解决方案2】:

    我知道这不是你要问的,但我就是这样做的。

    在 Owner 模型中的关系()返回中添加此项:

    'all_pets'=>array(self::HAS_MANY, 'Pet_Owner_Link','owner_id'),
    

    在 Pet_Owner_Link 模型中的关系()返回中添加此项:

    'pet'=>array(self::BELONGS_TO, 'Pet', 'pet_id'),
    

    那就养一只这样的宠物

    $owner->all_pets[$i]->pet;
    

    【讨论】:

    • 这在某些情况下有效(当我需要对链接表进行排序和执行其他操作时,我遇到过它),但如果您使用 AR MANY_MANY 关系,它通常会更清晰/更清晰.
    • 为什么给这个答案评分-1?我知道这不是选择的,但 -1 用于无意义的答案,事实并非如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2012-02-28
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多