2017-07-27 3 views
1

私はactivedataproviderのクエリを実行していますが、これは検索の目的で使用する予定です。私はクロスジョインを使用する必要があります。私はjoinWithを使用しましたが、製品との関係がない倉庫モデルについて不平を言います。それは製品を呼び出していた。それが十字結合なので、関係を引き起こさないように、ここの周りには何らかの作業がありますか?yii2を使ってクロスジョインする適切な方法はありますか?

その他の注意:product_id、product.categoryなどの特定の属性は、倉庫に基づく元のモデルには存在しません。パブリックプロパティ/属性変数を追加しただけでは問題は解決しますか? (impossibileまたは)困難であるすべてのクエリあなたがする必要はありませんので、あなたは配列としてクエリのレコードを取得しますfindBySql

$sql = "select 
      product.id as id 
      , warehouse.warehouse as warehouse 
      , product.category as category 
      , product.product as product 
      , coalesce(critical.min_stock, -1) as min_stock 
      from Warehouse 
      cross join product 
      left join critical on ritical.product_id = product.id AND critical.warehouse_id = warehouse.id 
      where warehouse.id' = " . $this->_id 

$model = Warehouse::findBySql($sql); 
+0

を使用して、モデル内の倉庫と製品との間の関係を定義し、ありますか? –

+0

@EdvinTenovimas app \ models \ Warehouseには「product」という名前の関係はありません。 – Corbee

+0

'Product'というモデルがあり、それらのテーブルの間にDBに関係がありますか? –

答えて

0

を使用することができますfunctionalites yii2のActiveRecordやactiveQueryを使用して構築するために

public function search($params) 
    {    
     $query = Warehouse::find()->joinWith('product') 
       ->select(['product_id' => 'product.id','warehouse.warehouse', 'product.category', 'product.product', 'min_stock' => 'coalesce(critical.min_stock, -1)']) 
       ->leftJoin('critical', 'critical.product_id = product.id AND critical.warehouse_id = warehouse.id') 
       ->where(['warehouse.id' => $this->_id]); 

     $this->load($params); 

     $dataProvider = new ActiveDataProvider([ 
      'query' => $query, 
     ]);   

     if (!$this->validate()) { 
      // uncomment the following line if you do not want to return any records when validation fails 
      // $query->where('0=1'); 
      return $dataProvider; 
     } 

     $query->andFilterWhere(['category' => $this->category]); 
     $query->andFilterWhere(['like', 'product', $this->product]);   

     return $dataProvider; 
    } 
1

関係を定義する

public function search($params) 
    {    
     $query = Warehouse::find()->joinWith('product') 
       ->select(['product_id' => 'product.id','warehouse.warehouse', 'product.category', 'product.product', 'min_stock' => 'coalesce(critical.min_stock, -1)']) 
       ->leftJoin('critical', 'critical.product_id = product.id AND critical.warehouse_id = warehouse.id') 
       ->where(['warehouse.id' => $this->_id]); 

     $query = Warehouse::find() 
       ->select('product.id as id,warehouse.warehouse as warehouse, product.category as category, product.product as product, coalesce(critical.min_stock, -1) as min_stock ') 
       ->leftJoin('product', 'warehouse.product_id = product.id') 
       ->leftJoin('critical', 'critical.product_id = product.id') 
       ->where(['warehouse.id' => $this->_id]); 
       ->andWhere('critical.warehouse_id = warehouse.id') 
       ->asArray(); 

     $this->load($params); 

     $dataProvider = new ActiveDataProvider([ 
      'query' => $query, 
     ]);   

     if (!$this->validate()) { 
      // uncomment the following line if you do not want to return any records when validation fails 
      // $query->where('0=1'); 
      return $dataProvider; 
     } 

     $query->andFilterWhere(['category' => $this->category]); 
     $query->andFilterWhere(['like', 'product', $this->product]);   

     return $dataProvider; 
    } 

これでオブジェクトとしてではなく配列として記録されます。

第二の方法は、hasOne()またはhasMany()正確関係のエラーは何

関連する問題