<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Propel  |  takeHo（たけほ）のへなちょこ台帳</title>
	<atom:link href="https://blog.takeho.com/tag/propel/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.takeho.com</link>
	<description>いわゆる自由帳ってところです。</description>
	<lastBuildDate>Tue, 09 Dec 2025 01:24:36 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6</generator>

<image>
	<url>https://blog.takeho.com/wp-content/uploads/2024/08/icon-150x150.png</url>
	<title>Propel  |  takeHo（たけほ）のへなちょこ台帳</title>
	<link>https://blog.takeho.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>PropelのページネーションとCriteriaを使ったSQLの演算子の使用例</title>
		<link>https://blog.takeho.com/4w2323lbcgziengzd7qaxvqfua9q9uup/</link>
					<comments>https://blog.takeho.com/4w2323lbcgziengzd7qaxvqfua9q9uup/#respond</comments>
		
		<dc:creator><![CDATA[たけほ]]></dc:creator>
		<pubDate>Tue, 10 Sep 2024 14:03:00 +0000</pubDate>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Criteria]]></category>
		<category><![CDATA[Propel]]></category>
		<guid isPermaLink="false">https://blog.takeho.com/?p=352</guid>

					<description><![CDATA[PHPフレームワークのSymfonyのバージョンはこの記事を執筆した時点で7.1.4がリリースされています。composerでのパッケージ管理により便利な機能が簡単に実装できる利便性の高さは評価できますが、開発したアプリ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHPフレームワークのSymfonyのバージョンはこの記事を執筆した時点で7.1.4がリリースされています。composerでのパッケージ管理により便利な機能が簡単に実装できる利便性の高さは評価できますが、開発したアプリケーションに対して各パッケージの詳細まで把握する事は滅多にありませんが運用上、「把握していない」、「知らない」はあってはならない事からパッケージ管理ツールが出回る以前の古いバージョンも今なお一定の人気があります。</p>



<p>ここではSymgony1.0.17をベースにデータベースを参照したページネーション機能とデータベースへの参照問合せで頻繁に使用する演算子の使用例について紹介します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2"><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ページネーション</a><ol><li><a href="#toc2" tabindex="0">アクションクラスへメソッドの追加</a></li><li><a href="#toc3" tabindex="0">改ページリンクの作成</a></li><li><a href="#toc4" tabindex="0">ページ情報（プロパティ）の作成</a></li><li><a href="#toc5" tabindex="0">ビュー（テンプレート）の作成</a></li></ol></li><li><a href="#toc6" tabindex="0">SQLの演算子の使用例</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ページネーション</span></h2>



<h3 class="wp-block-heading"><span id="toc2">アクションクラスへメソッドの追加</span></h3>



<p>アクションクラスへ次のメソッドを追加します。</p>



<pre class="wp-block-code"><code>  // 省略  

  public function executeList()
  {
    $c = new Criteria();
    $c->add(ProductPeer::＜カラム名＞, ＜値＞, ＜演算子(クラスメゾット)＞);
    $c->addDescendingOrderByColumn(ProductPeer::NAME);

    $pager = new sfPropelPager('Product', ＜表示させる件数＞);
    $pager->setCriteria($c);
    $pager->setPage($this->getRequestParameter('page', 0));
    $pager->init();

    $this->pager = $pager;
  }</code></pre>



<h3 class="wp-block-heading"><span id="toc3">改ページリンクの作成</span></h3>



<p>次にページャーリンクの関数を用意します。</p>



<p>アプリケーションディレクトリ内のlibディレクトリ内にhelperディレクトリを作成し次のファイルを作成します。</p>



<p>作成ファイル：<strong>PagerHelper.php</strong></p>



<pre class="wp-block-code"><code>&lt;?php

function pager_navigation($pager, $uri, $num = 8, $attach= '')
{
  $navigation = '';

  if ($pager->haveToPaginate())
  {
    $uri .= (preg_match('/\?/', $uri) ? '&amp;' : '?');
    $uri .= 'page=';

    if($num + 1 &lt; $pager->getPage()){
      $navigation .= '&lt;li>'.link_to('&lt;&lt;', $uri.'1').'&lt;/li>';
    }
    if ($pager->getPage() > 1){
      $navigation .= '&lt;li>'.link_to('&lt;', $uri.$pager->getPreviousPage()).'&lt;/li>';
    }

    $stcnt = ($pager->getPage() &lt;= $num) ? 1 : $pager->getPage() - $num;
    $encnt = ($pager->getPage() > ($pager->getLastPage() - 3)) ? $pager->getLastPage() : $pager->getPage() + $num;
    if($encnt > $pager->getLastPage()){
      $encnt = $pager->getLastPage();
    }

    for($i = $stcnt; $i &lt;= $encnt; $i++)
    {
      if ($i == $pager->getPage()) {
        // if ($page == $pager->getPage()) {
        $navigation .= '&lt;li class="active">&lt;a href="#">'.$i.'&lt;/a>&lt;/li>';
      }else {
        $navigation .= '&lt;li>'.link_to($i, $uri.$i).'&lt;/li>';
      }
    }


    if($pager->getPage() &lt;  $pager->getLastPage()){
      $navigation .= '&lt;li>'.link_to('>', $uri.$pager->getNextPage()).'&lt;/li>';
    }
    if($pager->getPage() + $num &lt;  $pager->getLastPage()){
      $navigation .= '&lt;li>'.link_to('>>', $uri.$pager->getLastPage()).'&lt;/li>';
    }
  }

  return '&lt;ul class="pagination '.$attach.'">'.$navigation.'&lt;/ul>';
}</code></pre>



<h3 class="wp-block-heading"><span id="toc4">ページ情報（プロパティ）の作成</span></h3>



<p>先程作成した<strong>PageHelper.php</strong>に表示しているページが全何件中、何処から何処まで表示しているか表示する機能を追加します。</p>



<pre class="wp-block-code"><code>function pager_infomation($pager, $format = '{total}件中 （{from}～{to}件表示）', $emp = 'Not found.')
{
  $infomation = '';
  if ($pager->getNbResults() > 0 ) {
    $total = $pager->getNbResults();
    if ($total > 0) {
      $from = $pager->getMaxPerPage() * ($pager->getPage()  - 1) + 1;
    }else {
      $from = $pager->getMaxPerPage() * ($pager->getPage()  - 1);
    }
    $to = $pager->getMaxPerPage() * ($pager->getPage()  - 1) + count($pager->getResults());
    $infomation = str_replace('{total}', $total, $format);
    $infomation = str_replace('{from}', $from, $infomation);
    $infomation = str_replace('{to}', $to, $infomation);
  }else {
    $infomation = $emp;
  }
  return $infomation;
}</code></pre>



<h3 class="wp-block-heading"><span id="toc5">ビュー（テンプレート）の作成</span></h3>



<p>次はビューファイル（listSuccess.php）の内容です。</p>



<pre class="wp-block-code"><code>&lt;?php use_helper('Pager') ?>
&lt;table>
  &lt;caption>&lt;?php echo pager_infomation($pager) ?>&lt;/caption>
  &lt;thead>
    &lt;th>品名&lt;/th>
    &lt;th>状態&lt;/th>
    &lt;th>金額&lt;/th>
    &lt;th>製造番号&lt;/th>
  &lt;/thead>
  &lt;tbody>
    &lt;?php foreach($pager->getResults() as $product): ?>
      &lt;tr>
        &lt;th>&lt;?php echo $product->getName() ?>&lt;/th>
        &lt;th>&lt;?php echo $product->getStatus() ?>&lt;/th>
        &lt;th>&lt;?php echo $product->getPrice() ?>&lt;/th>
        &lt;th>&lt;?php echo $product->getSerial() ?>&lt;/th>
      &lt;/tr>
    &lt;?php endforeach; ?>
  &lt;/tbody>
&lt;/table>
&lt;?php echo pager_navigation($pager, '＜アクションクラス名＞/list') ?></code></pre>



<p>Propelのページネーションの例は以上です。</p>



<h2 class="wp-block-heading"><span id="toc6">SQLの演算子の使用例</span></h2>



<p>次の表に演算子の使用例を紹介します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-left" data-align="left"><strong>SQL文</strong></td><td><strong>指定方法</strong></td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.STATUS = &#8216;enable&#8217;</td><td>$c->add(ProductPeer::STATUS, &#8216;enable&#8217;, Criteria::EQUAL);</td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.PRICE > 500</td><td>$c->add(ProductPeer::Price, 500, Criteria::GREATER_THAN);</td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.PRICE &lt; 500</td><td>$c->add(ProductPeer::Price, 500, Criteria::LESS_THAN);</td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.PRICE >= 500</td><td>$c->add(ProductPeer::Price, 500, Criteria::GREATER_EQUAL);</td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.PRICE &lt;= 500</td><td>$c->add(ProductPeer::Price, 500, Criteria::LESS_EQUAL);</td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.SERIAL LIKE &#8216;123%&#8217;</td><td>$c->add(ProductPeer::SERIAL, &#8216;123%&#8217;, Criteria::LIKE);</td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.STATUS IN(&#8216;close&#8217;, &#8216;disable&#8217;)</td><td>$c->add(ProductPeer::STATUS. array(&#8216;close&#8217;, &#8216;disable&#8217;), Criteria::IN);</td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.STATUS NOT IN(&#8216;close&#8217;, &#8216;disable&#8217;)</td><td>$c->add(ProductPeer::STATUS. array(&#8216;close&#8217;, &#8216;disable&#8217;), Criteria::NOT_IN);</td></tr><tr><td class="has-text-align-left" data-align="left">OFFSET 25</td><td>$c->setOffset(25);</td></tr><tr><td class="has-text-align-left" data-align="left">LIMIT 25</td><td>$c->setLimit(25);</td></tr><tr><td class="has-text-align-left" data-align="left">ORDER BY product.NAME ASC</td><td>$c->addAscendingOrderByColumn(ProductPeer::NAME);</td></tr><tr><td class="has-text-align-left" data-align="left">ORDER BY product.NAME DESC</td><td>$c->addDescendingOrderByColumn(ProductPeer::NAME);</td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.MESSAGE IS NULL</td><td>$c->add(ProductPeer::MESSAGE, null, Criteria::ISNULL);</td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.MESSAGE IS NOT NULL</td><td>$c->add(ProductPeer::MESSAGE, null, Criteria::ISNOTNULL);</td></tr><tr><td class="has-text-align-left" data-align="left">WHERE product.SERIAL REGEXP &#8216;.+456[0-9]{3}&#8217;</td><td>$c->add(ProductPeer::SERIAL, &#8221; REGEXP &#8216;.+456[0-9]{3}'&#8221;, Criteria::CUSTOM);</td></tr></tbody></table></figure>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.takeho.com/4w2323lbcgziengzd7qaxvqfua9q9uup/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
