CakePHP находит удаляемые поля или рекурсивный поиск

#cakephp #find #field

#cakephp #Найти #поле

Вопрос:

Я пытаюсь уменьшить количество запросов на поиск, указав, какие поля использовать. Я не понимаю, как я могу указать конкретные поля для моих полей HABTM.

Это моя находка:

 $lastviewed = $this->Lastviewedproduct->find('all', array(
    'fields' => array(
        'Lastviewedproduct.id', 'Lastviewedproduct.sessionid', 'Lastviewedproduct.product_id',
        'Product.id', 'Product.name', 'Product.slug', 'Product.price',
        //'Category.id',
        //'Mediafile.*',
    ),
    'conditions' => array(
        'Lastviewedproduct.status' => 'active',
        'Lastviewedproduct.sessionid' => $this->Session->read('Companyname.sessionid'),
        'Product.hidden_on_site' => 0,
        'Product.visibility' => 1,
        'Product.status' => 'active',
    ),
    'order' => 'Lastviewedproduct.modified DESC',
    'limit' => 5,
    'recursive' => 2,
));
  

Это то, что он возвращает:

 (int) 2 => array(
    'Lastviewedproduct' => array(
        'id' => '97',
        'sessionid' => '14035312318244955',
        'product_id' => '2'
    ),
    'Product' => array(
        'id' => '2',
        'name' => 'blokhut 2',
        'slug' => 'blokhut-2',
        'price' => '200.00',
        'Category' => array(
            (int) 0 => array(
                'id' => '218',
                'zosomodule_id' => '25',
                'user_add_id' => '0',
                'user_update_id' => '0',
                'created' => '2013-11-27 10:00:00',
                'modified' => '2013-11-27 10:00:00',
                'status' => 'active',
                'visibility' => true,
                'parent_id' => '2',
                'shipment_id' => '1',
                'name' => 'Metalen Tuinbergingen ',
                'slug' => 'metalen-tuinbergingen-',
                'pagetitle' => 'Metalen Tuinbergingen ',
                'content' => '<p class="p1"><span class="s1">Metalen tuinbergingen zijn een praktische en kwalitatieve oplossing voor meer bergruimte in uw tuin. Wij hebben diverse merken metalen bergingen zoals </span><span class="s2"><a href="/biohort-avantgarde/">Biohort</a></span><span class="s1">amp;nbsp;en </span><span class="s2"><a href="/yardmaster-metalen-bergingen/">Yardmaster</a></span><span class="s1">. Hier hebben wij tevens ook tuinkasten en opbergboxen van.</span></p>
<p class="p1"><span class="s1"><br /></span></p>
<p class="p1"><span class="s1">Mocht u op zoek zijn naar andere varianten tuinbergingen, bekijk dan ons gehele assortiment </span><span class="s2"><a href="/tuinbergingen/">tuinbergingen</a>.</span></p>',
                'metatitle' => 'Metalen tuinbergingen',
                'metadescription' => null,
                'discountoffer' => false,
                'discount_normal' => '0.00',
                'discount_max' => '0.00',
                'discount_ideal' => '0.00',
                'cost_rembours' => '0.00',
                'in_mainmenu' => true,
                'hide_sidebar' => false,
                'show_block' => true,
                'sort_order' => '0',
                'ProductsCategory' => array(
                    'id' => '2',
                    'created' => '2014-01-01 10:00:00',
                    'modified' => '2014-01-01 10:00:00',
                    'product_id' => '2',
                    'category_id' => '218'
                )
            )
        ),
        'Mediafile' => array()
    )
),
  

Мне не нужны все эти поля категории, а только Category.id , Category.name и Category.slug , например. Как мне сказать это в моей находке? Как вы можете видеть, я попытался добавить Category.id в свой массив полей, но затем я получаю сообщение об ошибке. Я что-то читал о containable, но у меня это не сработало, и я не знаю, является ли это решением.

Заранее спасибо за вашу помощь!

Ответ №1:

Для этой задачи можно использовать ContainableBehavior . Вы должны написать что-то вроде этого:
1 прикрепите поведение

  • постоянный

     class Lastviewedproduct extends AppModel {
        public $actsAs = array('Containable');    
        ....
    }
      
  • по требованию

     $this->Lastviewedproduct->Behaviors->load('Containable');
      

2 укажите поля

 $this->Lastviewedproduct->find('all', array(
    'contain' => array(
        'Product' => array(
            'Category' => array(
                'fields' => array('id','name','slug')               
            ),            
        ),
        'Mediafile'
    )
));
  

Комментарии:

1. Это работает, спасибо! Мне пришлось добавить строку в модель, как упоминал Войси, чтобы она работала. Может быть, вы можете обновить свой ответ, чтобы сделать его полным?

Ответ №2:

Добавьте параметр поля с кораблем отношений, где вы указываете отношение к МОДЕЛИ категории

 public $hasMany = array(
        'Category' => array(
            'className' => 'Category',
            'fields' => array('Category.id','Category.name','Category.slug')
        )
    );
  

Комментарии:

1. Но тогда я теряю всю категорию и массив медиафайлов. Я хочу сохранить их, потому что мне нужна информация от них. Мне просто не нужны все их поля. Итак, у меня есть вся информация, которая мне нужна, из моей находки, но я хочу уменьшить количество своих находок, чтобы получить обратно только необходимые поля. Я думал, что хорошо объяснил это в своем вопросе.

2. Вы имеете в виду, как мои модели привязаны в своих Model.php ? Они оба являются отношениями HAS и Bel Long stomany.

3. Да, я хочу просмотреть эти отношения

4. Lastviewedproduct имеет принадлежность к продукту. Продукт имеет hasAndBelongsToMany для категории и медиафайла. Это просто отношения, сгенерированные CakePHP.

5. Вы указали динамические отношения или в модели, которую вы указали?

Ответ №3:

Как сказал Дмитрий выше, Containable — это путь к этому:

В вашем Models/AppModel.php (Создайте его, если он не существует) измените вызов, чтобы он имел следующее:

 class AppModel extends Model {
    public $actsAs = array('Containable');
}
  

Тогда вы должны сделать так, как сказал Дмитрий выше — это позволит вам возвращать только те поля, которые вы хотите.

 'recursive' => 2 
  

в конечном итоге это приведет к такой медлительности, что ваше приложение будет болезненным в использовании, большинство людей устанавливают recursive = 1 в своей AppModel и используют containable в остальное время.