【问题标题】:How do subquery in ORM?ORM中如何进行子查询?
【发布时间】:2015-08-13 16:44:36
【问题描述】:

有桌子:

订单:

id
author_id
consumer_id
supplier_id
manager_id
status_id
created

orders_archive

id, 
order_id, 
user_id, 
created

即有订单,任何用户都可以标记订单存档(客户、经理..)

我们需要获取当前用户创建的所有记录,并因此添加到/已添加到存档中(同一用户)

$orders = ORM::factory('Order')
->where('author_id', '=', $this->user->id)
->and_where(?)

如何插入子查询?我是否正确理解您要使用DB::expr()?怎么样?

【问题讨论】:

  • orders_archiveorders 具有“属于”关系。那么就不能直接查询当前用户的所有orders_archive,得到对应的订单吗?
  • 这样就可以把归档中的所有记录都带上来,如何获取所有的记录,而不是那些已经加入归档的?

标签: mysql orm kohana kohana-orm kohana-3.3


【解决方案1】:

不久前我做过一次,我在 where 子句中使用了一个子查询,如下所示:

$query = ORM::factory('user')->from(array('users', 'user'));
$query->where(DB::Expr('NOT'), 'EXISTS', DB::Expr('(SELECT * FROM blacklists as b WHERE b.user_id = user.id AND b.target_user_id =' . $this->request->post('requester_id') . ')'));

但是另一种方法是这样的:

$query = DB::select()->from(array('table', 't'));
$sub = DB::select('imgname')->from('p_images')->where('pro_id','=',DB::Expr('`p`.`id`'))->and_where('imgtype','=','11')->limit(1);
$query->select(array($sub, 'prof_image'));
$p = $query->as_object()->execute();

【讨论】:

    【解决方案2】:

    既然是不同的表,为什么不为orders_archive 建立一个新的ORM 模型呢?然后类似下面的代码就可以了:

    $orders_archive = ORM::factory('Order_Archive')
    ->where('user_id', '=', $this->user->id)
    ->find_all();
    

    完全删除 ->and_where()。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 2018-08-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2011-03-11
      • 1970-01-01
      相关资源
      最近更新 更多