0

私はデータを取得しています:

$mydata = $this->ProductList->find('all', array('order' => 'rand()', 'conditions' => array('name' => 'we love')));

製品モデルとのHABTM関係を設定しました。ご覧のとおり、「大好き」リストのすべての商品を取得しています。ここで、取得している製品をランダム化する必要があります。ただし、そうではありません。代わりに、SQLで確認できるように、MySQLはProductListモデルでランダム化されます。何故ですか?代わりに、製品でランダムフェッチを取得するにはどうすればよいですか?

結果のMySQLクエリ:

SELECT `ProductList`.`id`, `ProductList`.`name` FROM `database`.`product_lists` AS `ProductList` WHERE `name` = 'we love' ORDER BY rand() ASC

SELECT `Product`.`id`, `Product`.`category_id`, `Product`.`name`, `Product`.`price`, `Product`.`description`, `ProductListsProduct`.`product_list_id`, `ProductListsProduct`.`product_id` FROM `database`.`products` AS `Product` JOIN `database`.`product_lists_products` AS `ProductListsProduct` ON (`ProductListsProduct`.`product_list_id` = 3 AND `ProductListsProduct`.`product_id` = `Product`.`id`)
4

1 に答える 1

0

編集:

これにアプローチする方法はたくさんあります。ユーザーの製品リストからランダムな製品を取得します。PHPでそれを行うことができます-すべての製品を見つけてrand()、返された配列から選択するために使用するだけです。モデルクエリ条件を設定できます。リストは続きます...

おそらく、RandomProductというProductListのProductモデルのエイリアスを作成します。関係を設定するときに、取得した製品のクエリを設定できます。

public $hasMany = array(
    'RandomProduct' => array(
        'className'     => 'Product',
        'foreignKey'    => 'product_list_id',
        'order'         => 'Rand()',
        'limit'         => '1',
        'dependent'     => true
    )
);

次に、包含可能な動作を使用して、このモデルが必要な場合にのみ取得されるようにすることができます。recursive(検索結果が-1より大きい場合は、これを行う必要はありませんが、通常、モデルが必要なデータのみをクエリするように、ベストプラクティスとしてこれを行います。)以下は、「welove」というProductListを返します。そして、そのリストに関連付けられた「ランダムな」製品。

$mydata = $this->ProductList->find(
    'all', 
    array(
        'conditions' => array(
            'name' => 'we love'
            )
        ),
        'contain' => array(
            'RandomProduct'
        )
    );
于 2012-12-27T01:45:27.420 に答える