使用thinkphp 关联模型has_one插入数据问题:插入数据的时候只操作一张表为啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用thinkphp 关联模型has_one插入数据问题:插入数据的时候只操作一张表为啥?相关的知识,希望对你有一定的参考价值。

使用thinkphp 关联模型has_one插入数据问题:插入数据的时候只操作一张表?附加表关联主表的外键是 sid;具体内容主表

附加表

代码如下:1.sellerModel.class.php<?phpclass sellerModel extends RelationModel protected $_validate = array( array('username', 'require', '%username_require'), //不能为空 array('username', '1,20', '%username_length_error', 0, 'length', 1), //用户名长度 array('password', '6,20', '%password_length_error', 0, 'length', 1), //密码长度 ); protected $_link=array( 'seller_other'=> array( 'mapping_type'=>HAS_ONE, //'class_name'=>'seller_other', //'mapping_name'=>'sother', //外键 'foreign_key'=>'id', ), );?>2.sellerAction.class.php 文件<?phpclass sellerAction extends Action public function add() if($this->isPost()) $res = $this->_mod->relation(true)->add($_POST); var_dump($res); $this->display(); ?>调试最终执行的sql语句是 只操作seller这种数据表。

两张表没有关联到一块,TP中的关联模型 不好搞懂,只要是对主键和外键要求很严格。一般情况下,主键和外键 的默认id为 表名_id 你可以把表中外键 id 字段 设置成 表名_id 试试追问

哪里不对呢?关联模型不是我那样定义的吗?

追答

两张表没有关联到一块,TP中的关联模型 不好搞懂,只要是对主键和外键要求很严格。一般情况下,主键和外键 的默认id为 表名_id 你可以把表中外键 id 字段 设置成 表名_id 试试

参考技术A 这是封装好的单表关联追问

就是主表关联附加表,一对一模型插入数据操作,结果都插入主表了,附加表的都没有参与。为什么会这样呢?没用过关联模型,一直没搞定这种问题。。

追答

这种情况,你做两次插入,别用关联模型,has_one还好理解点,has_many简直坑爹,不一定非要用TP的这个关联模型

参考技术B 同事添加了两条SQL语句,分别插入两个表里试试追问

问题就出在,关联模型不插入附加表的数据,我用create方法,只能插入主表的数据,附加表的数据直接过滤了,只能手动再写一条插入附加表的操作。那这个关联模型就没有用了啊

has_one 与用户和客户的关联以及 Rails 视图表单

【中文标题】has_one 与用户和客户的关联以及 Rails 视图表单【英文标题】:has_one association with user and customer and rails view form 【发布时间】:2013-01-22 15:56:35 【问题描述】:

我有一个 has_one 关联:

has_one 关联用户 -> 客户模型

用户将拥有 customer_id 还是客户将拥有 user_id 属性?

其他问题:在我的 _form 中,我想对所有未与客户关联的用户进行选择/选项,这是最好的方法吗?

非常感谢。

【问题讨论】:

【参考方案1】:

_id 字段始终在具有belongs_to 的模型中,并引用其他表名。

class Customer < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_one :customer
end

在这种情况下,customers 表将有一个 user_id 字段。

对于第二个问题,使用外连接在 SQL 中找到缺失值。 你想要的 SQL 是

select 
from users
  left outer join customers on users.id = customers.user_id
where customers.id is null

在 ActiveRecord 中,为您的 User 类添加一个范围。

在 Rails 3.x 中:

class User < ActiveRecord::Base
  has_one :customer

  scope :missing_customer,
    includes(:customer).where("customers.id is null")
end

在 Rails 2.3.x 中:

class User < ActiveRecord::Base
  named_scope :missing_customer,
     :joins => "left outer join customers on users.id = customers.user_id",
      :conditions => "customers.id is null" 
end

【讨论】:

好的,谢谢,也许范围是相反的,我需要在我的客户表单视图中缺少用户,并且选择选项标签显示所有不在 user_id 字段中的客户表中的用户

以上是关于使用thinkphp 关联模型has_one插入数据问题:插入数据的时候只操作一张表为啥?的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp关联模型 condition关联条件怎么用,能说个例子吗

ThinkPHP模型中的HAS_ONE,BELONG_TO,HAS_MANY实践

如何在同一模型中进行 has_many 和 has_one 关联?

Rails validates_presence_of 并验证 has_one 关联模型中的存在

处理一个用户模型的 has_one 和 has_many 关联

Thinkphp关联模型使用