2016-02-29 53 views
0

我想執行以下查詢,我只想從關聯中讀取必要的字段。
我在下面的select()中使用了一個點符號來更好地解釋我想要的。
基本上select()似乎只涉及Users。是否可以指定Sites的字段?如何選擇包含關聯的字段?

$orders = $this->Orders->find() 
    ->contain([ 
     'Sites.Users'=> function ($q) { 
      return $q 
       ->select([ 
        'Sites.id', 
        'Sites.user_id', 
        'Users.id', 
        'Users.name', 
        'Users.owner_id', 
        'Users.firstname', 
        'Users.lastname' 
       ]) 
       ->autoFields(false); 
     }, 
    ]) 
    ->first(); 

回答

3

您必須單獨配置限制,選擇其他限制的字段將不起作用。

要準確,不能選擇比相應的容納狀態的遏制,從其他地方領域,通過與belongsTo/hasOne協會唯一的例外是正在使用的連接策略,爲他們字段可以在select()調用的選擇即時的「父」查詢,因爲這些關聯將通過該查詢中的連接來檢索。

如果例如Sites將是belongsTo關聯,那麼您可以通過調用Orders來爲其選擇字段。如果Users將是belongsTo,但是Sites a hasMany,那麼您可以使用select()呼叫Sites來選擇Users的字段。

話雖這麼說,你的情況,你要麼使用queryBuilder選項嵌套陣列結構

contain([ 
    'Sites' => [ 
     'queryBuilder' => function ($q) { 
      return $q 
       ->select([ 
        'Sites.id', 
        'Sites.user_id' 
       ]); 
     }, 
     'Users' => function ($q) { 
      return $q 
       ->select([ 
        'Users.id', 
        'Users.name', 
        'Users.owner_id', 
        'Users.firstname', 
        'Users.lastname' 
       ]); 
     } 
    ] 
]) 

定義回調或者,如果你實際上並不需要查詢生成器,使用fields選項

contain([ 
    'Sites' => [ 
     'fields' => [ 
      'Sites.id', 
      'Sites.user_id' 
     ], 
     'Users' => [ 
      'fields' => [ 
       'Users.id', 
       'Users.name', 
       'Users.owner_id', 
       'Users.firstname', 
       'Users.lastname' 
      ] 
     ] 
    ] 
]) 

又見

+0

好的非常感謝這些相關信息。 – 2ndGAB

相關問題