We have moved our forum to GitHub Discussions. For questions about Phalcon v3/v4/v5 you can visit here and for Phalcon v6 here.

Models Manager Hydrate Mode

$this->modelsManager->createBuilder() ->from('Projects') ->leftJoin('Members') ->getQuery() ->execute();

This gives me whole query structure but i need only nested array. Is there a way to do it without foreach loop like setHydration.

Thank you

$this->modelsManager->createBuilder() ->from('Projects') ->leftJoin('Members') ->getQuery() ->execute()->toArray(); //This?

I watch Phalcon 2.0.0 and I didnt found any methods like setHydration mod on QueryBuilder or execute() methods but It's posible in Criteria in Phalcon 2, but not a public method

No in Phalcon 1 https://docs.phalcon.io/en/latest/api/Phalcon_Mvc_Model_Criteria.html https://docs.phalcon.io/en/latest/api/Phalcon_Mvc_Model_ResultsetInterface.html

For now Phalcon ORM is useless Item

It think you can use @max variant or user Phalcon\Db\Result\Pdo fetch ASSOC https://docs.phalcon.io/en/latest/api/Phalcon_Db_Result_Pdo.html

Bad news for you :)



98.9k

https://github.com/phalcon/cphalcon/blob/2.0.0/phalcon/mvc/model/resultset.zep#L385

I watch Phalcon 2.0.0 and I didnt found any methods like setHydration mod on QueryBuilder or execute() methods but It's posible in Criteria in Phalcon 2, but not a public method

No in Phalcon 1 https://docs.phalcon.io/en/latest/api/Phalcon_Mvc_Model_Criteria.html https://docs.phalcon.io/en/latest/api/Phalcon_Mvc_Model_ResultsetInterface.html

For now Phalcon ORM is useless Item

It think you can use @max variant or user Phalcon\Db\Result\Pdo fetch ASSOC https://docs.phalcon.io/en/latest/api/Phalcon_Db_Result_Pdo.html

Bad news for you :)

I saw this

https://github.com/phalcon/cphalcon/blob/2.0.0/phalcon/mvc/model/resultset.zep#L385 This doesnt do anything, only int type.

https://github.com/phalcon/cphalcon/blob/2.0.0/phalcon/mvc/model/resultset.zep#L385

I watch Phalcon 2.0.0 and I didnt found any methods like setHydration mod on QueryBuilder or execute() methods but It's posible in Criteria in Phalcon 2, but not a public method

No in Phalcon 1 https://docs.phalcon.io/en/latest/api/Phalcon_Mvc_Model_Criteria.html https://docs.phalcon.io/en/latest/api/Phalcon_Mvc_Model_ResultsetInterface.html

For now Phalcon ORM is useless Item

It think you can use @max variant or user Phalcon\Db\Result\Pdo fetch ASSOC https://docs.phalcon.io/en/latest/api/Phalcon_Db_Result_Pdo.html

Bad news for you :)



98.9k

You said:

Bad news for you :)

I didnt found any methods like setHydration

I'm showing you where the setHydration is

Oh, Sorry, my wrong message I was going to said "no setHydration was founded in Phalcon 1.3 and in Phalcon 2.0 It cant be used as hydration method" Phalcon 1.3 https://github.com/phalcon/cphalcon/search?utf8=%E2%9C%93&q=setHydration

You said:

Bad news for you :)

I didnt found any methods like setHydration

I'm showing you where the setHydration is



8.1k

You can determined any columns in your query as like :


return $this->getDI()->getModelsManager()->createBuilder()
            ->columns([
                'replays.*',
                'author.*',
                'discussion.*'
                ])
            ->from([
                'replays'         => '\Forum\Apps\Models\Replays',
                ])
            ->leftjoin('\Forum\Apps\Models\Users', 'replays.user_id = author.id', 'author')
            ->leftjoin('\Forum\Apps\Models\Discussions', 'replays.discussion_id = discussion.id', 'discussion')
            ->where('replays.discussion_id = :id:', array('id' => $id))
            ->orderBy(["replays.created_at DESC"])
            ->getQuery()
            ->execute();

Yes but i want to nested arrays with the sub models data. This give me one directional data. I magage to fix the situation with lopping through parent model's foreach and add joined data on every iteration.

You can determined any columns in your query as like :


return $this->getDI()->getModelsManager()->createBuilder()
           ->columns([
               'replays.*',
               'author.*',
               'discussion.*'
               ])
           ->from([
               'replays'         => '\Forum\Apps\Models\Replays',
               ])
           ->leftjoin('\Forum\Apps\Models\Users', 'replays.user_id = author.id', 'author')
           ->leftjoin('\Forum\Apps\Models\Discussions', 'replays.discussion_id = discussion.id', 'discussion')
           ->where('replays.discussion_id = :id:', array('id' => $id))
           ->orderBy(["replays.created_at DESC"])
           ->getQuery()
           ->execute();


8.1k

Don't know....

Result of call this method is full iterability :

This code is used in Replays model as


public function getreplaysFromDiscussion($id) {

        return $this->getDI()->getModelsManager()->createBuilder()
            ->columns([
                'replays.*',
                'author.*',
                'discussion.*'
                ])
            ->from([
                'replays'         => '\Forum\Apps\Models\Replays',
                ])
            ->leftjoin('\Forum\Apps\Models\Users', 'replays.user_id = author.id', 'author')
            ->leftjoin('\Forum\Apps\Models\Discussions', 'replays.discussion_id = discussion.id', 'discussion')
            ->where('replays.discussion_id = :id:', array('id' => $id))
            ->orderBy(["replays.created_at DESC"])
            ->getQuery()
            ->execute();                
    }

in controller -

$r = new Replays();
        $res = $r->getreplaysFromDiscussion(5)->getFirst();

        foreach ($res as $key => $value) {
            var_dump($res->$key->toArray());

        }

result


array(6) {
  ["id"]=>
  string(1) "3"
  ["body"]=>
  string(16) "replay bodt test"
  ["discussion_id"]=>
  string(1) "5"
  ["user_id"]=>
  string(1) "1"
  ["created_at"]=>
  string(2) "31"
  ["updated_at"]=>
  string(2) "31"
}
array(4) {
  ["id"]=>
  string(1) "1"
  ["email"]=>
  string(14) "[email protected]"
  ["nikname"]=>
  string(5) "user1"
  ["password"]=>
  string(5) "12345"
}
array(7) {
  ["id"]=>
  string(1) "5"
  ["title"]=>
  string(31) "test discuss with topic control"
  ["topic"]=>
  string(36) "test discuss with topic control body"
  ["categoriesId"]=>
  string(1) "1"
  ["usersId"]=>
  string(1) "1"
  ["createdAt"]=>
  string(10) "1409414692"
  ["slug"]=>
  string(31) "test_discuss_with_topic_control"
}

I don't see obstacles anything.

That's solution no doubt. i'm new at Phalcon (phalcon is great nut:)) but in Eloquent ORM you can join hasMany models in reqursive array. For example;

<?php
    Project::find(5)->with('Members')->get() 
?>

gives,

 [
    "id" => 5,
    "project_name" => "bla bla",
    "Members" => [
        ["id" => 88, "name" => "John"],
        ["id" => 89, "name" => "Fatih"],
        ..
    ]
 ]


8.1k
Accepted
answer

Then you can use Phalcon ORM. You will get same result.

No obstacle :

$r = new Replays();
        var_dump($r->findFirst()->getDiscussion()->toArray());

result

array(7) {
  ["id"]=>
  string(1) "5"
  ["title"]=>
  string(31) "test discuss with topic control"
  ["topic"]=>
  string(36) "test discuss with topic control body"
  ["categoriesId"]=>
  string(1) "1"
  ["usersId"]=>
  string(1) "1"
  ["createdAt"]=>
  string(10) "1409414692"
  ["slug"]=>
  string(31) "test_discuss_with_topic_control"
}

Phalcon allows you to do all that Laravel can, and more...

I'm using Phalcon and Laravel in my business.

Laravel is weaker than Phalcon in functionality, I experienced this in practice. :)