[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: sql, что не правильно? Kohana CMF
CyberOrcX
Как уже видели по заголовку, вопрос, для тех кто разбирается в Кохана, если конечно проблема в чем-то связанная с вызовами функций движка

Модель

public function get_client_info()
{
$client = "SELECT c1.name, c1.email FROM ".$this->_tableWorks." w1
INNER JOIN "
.$this->_tableClients." c1 ON w1.client_id = c1.id";

return DB::query(Database::SELECT, $client)
->
execute()
->
as_array();
}


Вид
<i>Заказчик: 
<!-- не пойму почему получается несколько строк из таблицы Клиентов-->
<a href="mailto:<?php echo $c_info[0]['email']; ?>">
<?php
echo $c_info[0]['name']; ?> //
</a>
</i>


Контроллер
public function action_works()
{
$id = $this->request->param('id');
$works = array();

if (!empty($id))
{
$content = View::factory("/pages/work");
}
else
{
$content = View::factory("/pages/works")
->
bind('works', $works)
->
bind('c_info', $client_info);
}

$works = Model::factory('Works')->get_all();
$client_info = Model::factory('Works')->get_client_info();

$this->template->content = $content;
}

представляете что получается в итоге?
должно получиться превью, с именем Заказчика данного проекта, а у меня в итоге выводится столько заказчиков, сколько есть в таблице Клиентов

у меня ошибка по-любому в SQL :) я не пойму как правильно поставить вопрос, извиняюсь, да простят меня модераторы форума)



Спустя 5 часов, 36 минут, 28 секунд (15.06.2012 - 08:11) Placido написал(а):
Подозреваю, что движок Кохана здесь ни при чем. Я так понимаю, для того чтобы выбрать какую-то запись из таблицы, нужно, чтобы в выборке присутствовало соответствующее условие (что-то вроде WHERE w1.client_id = " . $id). А его нет.
======
Хотя могу и ошибаться. Возможно, выбираются все клиенты, но тогда id нужного клиента должно присутствовать в php-коде (что-нибудь вроде $c_info[$id]['name']).

Спустя 2 минуты, 51 секунда (15.06.2012 - 08:13) T1grOK написал(а):

//где $id - идентификатор заказчика
public function get_client_info($id)
{
$client = "SELECT c1.name, c1.email FROM ".$this->_tableWorks." w1
INNER JOIN "
.$this->_tableClients." c1 ON w1.client_id = c1.id
WHERE w1.client_id= '
{$id}' ";

return DB::query(Database::SELECT, $client)
->
execute()
->
as_array();
}

Собственно то что Placido подразумевал.

Спустя 3 часа, 23 минуты, 37 секунд (15.06.2012 - 11:37) CyberOrcX написал(а):
видимо мне здесь не удивиться

Спустя 11 минут, 51 секунда (15.06.2012 - 11:49) CyberOrcX написал(а):
ладно, хрен с ним с этим привязыванием

Спустя 1 час, 33 минуты, 6 секунд (15.06.2012 - 13:22) Семён написал(а):
Наблюдаю полное непонимание функционала Kohan-ы, хотябы потому что вместо current() вижу as_array()

Спустя 27 минут, 21 секунда (15.06.2012 - 13:49) CyberOrcX написал(а):
он мне только одну запись дал, правильно)) это я знаю

короче, объясняю еще раз, может понятней станет

есть две таблицы в БД - клиенты, заказы
в таблице заказов есть дополнительное поле client_id, которое в логическом последствии должно быть использовано для привязывания двух таблиц
в таблице клиентов - id, name, email

логичное условие я думаю, когда client_id в таблице заказов равняется id в таблице клиентов

в итоге у меня получается следующий SQL-запрос

SELECT c1.name, c1.email FROM Works w1 
INNER JOIN Clients c1 ON w1.client_id = c1.id;


соответственно две модели: модель_клиенты, модель_заказы
в каждой модели по одной функции вытягивания информации из соответственных таблиц БД

это работает всё прекрасно

идея понятна, что нужно использовать current() вместо as_array()
правильно, мне нужно получить только одну запись

в Контроллере Action-метод для страницы Заказов

public function action_works()
{
$id = $this->request->param('id');
$works = array();
$client_info = "";

// если параметр передан в запросе, то показываем отдельный заказ
if (!empty($id))
{
$content = View::factory("/pages/work");
}
// показываем preview заказов
else
{
$content = View::factory("/pages/works")
->
bind('works', $works)
->
bind('cinfo', $client_info);
}

$works = Model::factory('Works')->get_all();
$client_info = Model::factory('Works')->get_client_info();

$this->template->content = $content;
}


функция получения информации о клиенте в модели заказов

public function get_client_info()
{
$client_info = "SELECT c1.name, c1.email FROM ".$this->_tableWorks." w1
INNER JOIN "
.$this->_tableClients." c1 ON c1.id = w1.client_id";

return DB::query(Database::SELECT, $client_info)
->
execute()
->
current();
}


Вид страницы заказов

<?php foreach($works as $work): ?>
<div style="padding: 10px; margin-bottom: 10px; border-bottom: #333 2px solid; ">
<
strong><a href="<?php echo $work['url']; ?>"><?php echo $work['name']; ?></a></strong> / <?php echo $work['type']; ?><br />
<
i>Автор: <?php echo $work['author']; ?></i> /
<
i>Дата публикации: <?php echo $work['date']; ?></i><br /><br />
<
p>
<
img src="/public/images/<?php echo $work['picture']; ?>"
width="120" height="150" />
</
p>
<
i>
Клиент:
<
a href="mailto: <?php echo $cinfo['email']; ?>">
<?php
//должно быть
echo $cinfo['name'];
?></a>
</
i>
</
div>
<?php endforeach; ?>


либо что-то у меня в выводе неправильно, либо я в модели неправильно получаю данные, либо в контроллере неправильно их обрабатываю))
не пойму)

Спустя 20 часов, 16 минут, 33 секунды (16.06.2012 - 10:06) T1grOK написал(а):
Цитата (T1grOK @ 15.06.2012 - 05:13)

//где $id - идентификатор заказчика
public function get_client_info($id)
{
$client = "SELECT c1.name, c1.email FROM ".$this->_tableWorks." w1
INNER JOIN "
.$this->_tableClients." c1 ON w1.client_id = c1.id
WHERE w1.client_id= '
{$id}' ";

return DB::query(Database::SELECT, $client)
->
execute()
->
as_array();
}

Собственно то что Placido подразумевал.

Автор, я же уже написал правильный ответ, а вы все развиваете тему неизвестно что и почему.

Из контроллера передали в модель айдишник и все дела.
public function action_works()
{
//Судя по логике - это и есть ИД клиента
$id = $this->request->param('id');
$works = array();
$client_info = "";

// если параметр передан в запросе, то показываем отдельный заказ
if (!empty($id))
{
$content = View::factory("/pages/work");
}
// показываем preview заказов
else
{
$content = View::factory("/pages/works")
->
bind('works', $works)
->
bind('cinfo', $client_info);
}

$works = Model::factory('Works')->get_all();
$client_info = Model::factory('Works')->get_client_info($id);

$this->template->content = $content;
}

Спустя 6 часов, 28 минут, 43 секунды (16.06.2012 - 16:35) CyberOrcX написал(а):
мне нужен функционал наподобие комменты к статьям, одно условие, коммент только один должен быть

то есть, заказы (статьи), и клиенты (комменты)

у каждого заказа есть свой клиент (коммент к статье)

вот я хочу реализовать это, чтобы в цикле вывода заказов, снизу была надпись кто заказывал - имя клиента, вытянутый из другой таблицы

я конечно могу поступить не очень правильно, в одну таблицу запихнуть это всё, и выводить из этой таблицы, ну я хочу правильно сделать)

Спустя 11 минут, 50 секунд (16.06.2012 - 16:46) CyberOrcX написал(а):
ладно, топик исчерпан
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.