MY_Model jamierum ниже

Ребята

Я использую эту модель в своем проекте. Но в настоящее время я сталкиваюсь с производительными шумами из-за повторяющегося запроса с помощью метода и, конечно, с необходимостью сделать предложение 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 или с небольшими изменениями.

0

Решение

Я тоже использую Базовую модель @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() Все столы объединены.

3

Другие решения

Если у вас проблемы с производительностью, не используйте with()! Это грубый способ управления отношениями, используемый только для создания прототипов или простых отношений.

Я бы рекомендовал делать соединения вручную:

$products = $this->select('products.*')
->join('profile', 'p.id = products.profile_id', 'inner')
->where('profile.is_verified', true)
->get_all();
1

Danielad,

Есть много доступных технологий кэширования. В моем проекте мы используем Redis, Memcached также. Также используется кэширование на стороне клиента (веб-сайта) для Javascripts, CSS, изображений и т. Д.

Redis / Memcached — очень мощные инструменты. Facebook использует Memcached для очень быстрого вывода и низкой нагрузки на серверы баз данных.

Надеюсь это поможет !!

-1
По вопросам рекламы [email protected]