2018-08-29 16:43:22 3704次浏览 4条回答 1 悬赏 10 金钱

我用 model->selst()->joinWith(..., true) 时,里面关联的模型是所有字段都查出来了的,前面的 select 设置没有效果,能不能让关联的模型也显示指定的字段呢

比如:

有两个表,一个order表,字段有order_id,order_name,一个book表,字段有book_id,book_name,book_code,然后我使用
order::find()->select(['order_name', 'book.name'])->joinWith('book')->asArray()->one()
这样得出的结果是['order_name', 'book_name', 'book' => ['book_id', 'book_name', 'book_code']]
但我想要这样['order_name', 'book_name', 'book' => ['book_name']],要如何做

最佳答案

  • zhoupenghui 发布于 2018-09-05 17:40 举报

    可以类似这样:

    Order::find()
        ->select(['order_name'])
        ->joinWith([
            'book book' => function ($query) {
                query->select(['book.id', 'book.name'])
            }
        ]);
    
    1 条回复
    回复于 2018-09-10 10:16 回复

    厉害啊,ActiveQueryTrait里的normalizeRelations方法最后会把$relation这个关联模型调用匿名函数,我居然看漏了

  • 回答于 2018-08-30 09:52 举报

    select里指定后面关联的模型字段呢?比如 Order::find()->select('book.name')->joinWith('book')

    1 条回复
    回复于 2018-08-30 10:35 回复

    只能得出['order_id', 'name', 'book'=>[book全部字段]] 这样的数据

  • 回答于 2018-08-30 10:13 举报

    尝试一下在模型的关联关系里面增加select查询。

  • 回答于 2018-08-30 10:59 举报

    https://www.yiichina.com/doc/guide/2.0/db-active-record 这里面写了joinWith的用法,select 指定出字段就会给出指定的值,如果你还是觉得有问题,可以把你的执行sql打印出来看看是什么样就知道哪有问题

    5 条回复
    回复于 2018-08-30 11:55 回复

    sql没问题,就是填充的关联数据没有做select

    回复于 2018-08-30 13:20 回复

    你写的代码和执行结果贴出来,这样谁也不知道你问题出在哪里

    回复于 2018-08-30 13:39 回复

    我把问题完善了一下

    回复于 2018-08-30 14:10 回复

    order::find()->select(['order_name', 'book.name'])->joinWith('book',false)->asArray()->one();
    joinwith 会默认及时加载相应数据,如果不需要则第二个参数 为false即可,仔细看看我给你的那个链接,上面写着呢

    回复于 2018-08-30 15:07 回复

    我就是需要那个相应数据也就是那个['book' => [xxxx]],如果设为false它就没了。按照上面的方法查是把book所有字段都显示出来,但我不想显示那么多字段,框架是否有提供方法

    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
wsd15321
见习主管

wsd15321

注册时间:2017-11-08
最后登录:2019-06-13
在线时长:3小时12分
  • 粉丝0
  • 金钱255
  • 威望20
  • 积分485

热门问题