#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 в остальное время.