Ребята
Я использую эту модель в своем проекте. Но в настоящее время я сталкиваюсь с производительными шумами из-за повторяющегося запроса с помощью метода и, конечно, с необходимостью сделать предложение Inner Join with Where для связанных объектов и как я могу это сделать?
я имею Profile
,Media
,Product
связанный с таблицей.
Когда я хочу получить все продукты с профилем, носителем и деталями, я использую приведенный ниже код. И он работает, кроме как сповторные выборочные заявления.
$all_products = $this->with('medias')->with('profile')->get_all();
Теперь я хочу, чтобы все продукты были проверены.
select * from products
inner join profile as p on p.id = product.profile_id
inner join media as m on m.product_id=p.product_id
where profile.is_verfied='true';
Как я могу сделать это, используя мой способ MY_MODEL или с небольшими изменениями.
Я тоже использую Базовую модель @Jamie Rumbelow, с небольшими изменениями (одна или две). Когда дело доходит до присоединения, у него есть замечательный метод запуска, который вы можете использовать: before_get
наблюдатель. В вашем случае просто добавьте наблюдателя, к которому вы можете присоединиться из необходимых таблиц, например:
В вашей модели конструктор:
public function __constrcutor()
{
array_unshift(
$this->before_get,
'join_from_profile_and_media'
);
// Then
parent::__construct();
}
И наблюдатель будет:
protected function join_from_profile_and_media()
{
$this->db->join('profile', 'profile.id = product.profile_id');
$this->db->join('media', 'media.product_id = profile.product_id');
}
И теперь всякий раз, когда вы звоните get()
, get_many()
, get_by()
или же get_many_by()
Все столы объединены.
Если у вас проблемы с производительностью, не используйте with()
! Это грубый способ управления отношениями, используемый только для создания прототипов или простых отношений.
Я бы рекомендовал делать соединения вручную:
$products = $this->select('products.*')
->join('profile', 'p.id = products.profile_id', 'inner')
->where('profile.is_verified', true)
->get_all();
Danielad,
Есть много доступных технологий кэширования. В моем проекте мы используем Redis, Memcached также. Также используется кэширование на стороне клиента (веб-сайта) для Javascripts, CSS, изображений и т. Д.
Redis / Memcached — очень мощные инструменты. Facebook использует Memcached для очень быстрого вывода и низкой нагрузки на серверы баз данных.
Надеюсь это поможет !!