Athari / YaLinqo

Yet Another LINQ to Objects for PHP [Simplified BSD]
https://athari.github.io/YaLinqo
BSD 2-Clause "Simplified" License
441 stars 39 forks source link

Using with PDO MySQL - a datetime example #20

Closed pipiscrew closed 7 years ago

pipiscrew commented 7 years ago

hi there,

Im using it also to 'query' date/datetime field, in example an array from PDO MySQL, works flawless... :) not optimized the manual dates (2017-02-12/2017-02-15) should be stored on vars, out of the loop.

$result3 = from($rows)
->where(function ($x) { return
strtotime($x['datecreated']) >= strtotime("2017-02-12") && 
strtotime($x['datecreated']) < strtotime("2017-02-15"); })
->select(function($res){ return array(
            "country" => $res['country'],
            "datecreated" => $res['datecreated']
        ); })
->toArray();

and also advise that can be used without composer :

require_once('/YaLinqo/Utils.php');
require_once('/YaLinqo/Functions.php');
require_once('/YaLinqo/Linq.php');
require_once('/YaLinqo/EnumerablePagination.php');
require_once('/YaLinqo/EnumerableGeneration.php');
require_once('/YaLinqo/Enumerable.php');
require_once('/YaLinqo/Errors.php');
require_once('/YaLinqo/OrderedEnumerable.php');

for groupby - check also - https://gist.github.com/mcaskill/baaee44487653e1afc0d

thanks for your time!

Athari commented 7 years ago
  1. Using YaLinqo's where-queries on database tables results in wasted resources. Filtering on SQL side is much much faster than tranfering the whole table into a huge PHP array and filtering using PHP code. If you can afford wasting resources, it's fine, but usually it's way too much. So if you can perform a query fully in SQL, you should do so.

    YaLinqo should be used when SQL isn't available (e.g. results from simple web services), or the logic is too complex for SQL (and even then as much logic as possible should be performed in SQL).

  2. In the modern world, I see no reason to not use Composer. Sure, you can include every single file, but even if you don't like Composer, you can use a tiny one-line PSR-0 compliant autoloader instead which will make all the work for you.

    spl_autoload_register(function($c){@include preg_replace('#\\\|_(?!.+\\\)#','/',$c).'.php';});
  3. The function in this gist is much simpler than YaLinqo's. Its only benefit is simpler syntax when working with array keys.

pipiscrew commented 7 years ago

hi @Athari

1-correct. The current situation is any query made in dbase the response takes ~2min (because is this dbase falling too many users.). As a result, I take all the needed records with a query then separate by YaLinqo :)

2- :) thanks I will try it.

3-ofc

greets!

pipiscrew commented 7 years ago

hi again,

found a complete example for spl_autoload_register

// Add the appropiate extra include paths here
$includePaths = array(
    __DIR__."/../vendor/",
    __DIR__."/../modules/"
);

// Add the above paths to the global include path
set_include_path(implode(PATH_SEPARATOR, $includePaths));

// Register the psr-0 autoloader for ease of use 
spl_autoload_register(function($c){@include preg_replace('#\\\|_(?!.+\\\)#','/',$c).'.php';}); 

the need :

using the following while loop on where line, the variable $startdate is Undefined variable...

Any tip?

$startdate = strtotime($dtp_start." UTC");
$enddate = strtotime($dtp_end." UTC");

while($startdate < $enddate) {

    $result4 = from($rows)
    ->where(function ($x) { 
        return strtotime($x['CLOSE_DATE']) < strtotime('+8 days', $startdate)  && $x['OWWNER']=='costas'; })
    ->toArray();

    $startdate = strtotime('+7 days', $startdate);
} 
Athari commented 7 years ago

Your anonymous function lacks use statement:

   ->where(function ($x) use ($startdate) { ...