Is there a way to use MongoDB without ORM in Laravel 5? - mongodb

Basically, I see Eloquent (for that matter, any ORM) as overhead, as MongoDB itself deals with document objects.
I am looking to use native PHP MongoDB code with application wide database connection object, for a greater performance.
Any library or a simple way to achieve this?

I have read a few things and used PHP MongoDB driver with custom "Model" code, with base class like below:
AppModel.php
<?php
namespace App;
use MongoClient;
use MongoId;
use Log;
class AppModel {
public $collection;
public function __construct() {
$mongo = new MongoClient();
$model_name = (new \ReflectionClass($this))->getShortName();
$collection_name = str_plural(strtolower($model_name));
$this->collection = $mongo->selectCollection('proj_zabbit', $collection_name);
}
public function findById($id) {
return $this->collection->findOne(array(
'_id' => new MongoId($id)
));
}
// more wrapper functions ..
}
Extended model class:
<?php
namespace App;
class Message extends AppModel {
}
In Controller:
<?php namespace App\Http\Controllers;
use App\Message;
class MessagesController extends Controller {
public function __construct()
{
$this->Message = new Message;
}
public function get()
{
$id = Input::get('id');
$message = $this->Message->findById($id);
return $message;
}
}

Related

What would the magento 2 equivalent of Mage::helper('core')->?

What would the magento 2 equivalent of Mage::helper('core')-> ?
The Mage static methods are not existing anymore, you will have to use dependency injection to get your helper instance, for example in your model:
<?php
namespace Mycompany\Mymodule\Model;
use Mycompany\Mymodule\Helper\Data;
class Custom {
private $helper;
public function __construct(
Data $helper
) {
$this->helper = $helper;
}
public function myMethod() {
$this->helper->helperMethod();
}
}
You can use the same system in Blocks etc.. and for existing helpers that you want to use.

Can't get the current logged in user's id

I have two tables: users and posts. I made relation between these two tables. When I try to save, the post created by the user to posts to a table. It does not pass the user's id. Please check the below code:
User Model ( App\User.php )
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable;
class User extends Model implements Authenticatable
{
use \Illuminate\Auth\Authenticatable;
public function posts()
{
$this->hasMany('App\Post');
}
}
Post Model ( App\Post.php )
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
public function user()
{
$this->belongsTo('App\User');
}
}
Post Controller ( App\Http\Controllers\PostController.php )
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Post;
class PostController extends Controller
{
public function postCreatePost(Request $request)
{
//validation here will come
$post = new Post();
$post->body = $request['body'];
$request->user()->posts()->save();
return redirect()->route('dashboard');
}
}
Errors
I found the solution. So, I will post the answer of my question.
I get the current logged in user'id from Auth::id();
So I changed my codes as below
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Post;
class PostController extends Controller
{
public function postCreatePost(Request $request)
{
//validation here will come
$post = new Post();
$post->body = $request['body'];
$post->user_id = \Auth::id();
$post->save();
return redirect()->route('dashboard');
}
}

How to instance doctrine entity manager in a symfony2 class

I am new with Symfony 2 and Doctrine.
I have created a new class on my symfony project, which is located in:
project_folder/src/Libraries/Validarcontenido/Validarcontenido.php
I need to get the Doctrine Entity Manager instance in this class.
I have reading docs about it, and everyone says that i must add the class into the services.yml file, but didn't work.
Here is my code:
<?php
namespace Libraries\Validarcontenido;
use AdminBundle\Entity\Aportes;
use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpFoundation\Request;
class Validarcontenido
{
private $request, $post, $em;
public function __construct()
{
$this->request = Request::createFromGlobals();
$this->post = $this->request->request->all();
// gets doctrine instance
$this->em = $this->getContainer()->get('doctrine');
}
}
And the services.yml:
# Learn more about services, parameters and containers at
# http://symfony.com/doc/current/book/service_container.html
parameters:
# parameter_name: value
services:
validarcontenido.service:
class: Libraries\Validarcontenido\Validarcontenido
arguments: [#doctrine.orm.entity_manager]
But Symfony returns me this error message:
Attempted to call an undefined method named "getContainer" of class "Libraries\Validarcontenido\Validarcontenido".
500 Internal Server Error - UndefinedMethodException
What i am doing wrong? Thank you so much.
You have to use the constructor to set the entity manager:
class Validarcontenido
{
private $request, $post, $em;
public function __construct(EntityManager $em)
{
$this->request = Request::createFromGlobals();
$this->post = $this->request->request->all();
$this->em = $em;
}
}
You need to create your class as a service in the service.yml as you already did, only you were almost there.
You need to change your class as this:
<?php
namespace Libraries\Validarcontenido;
use AdminBundle\Entity\Aportes;
use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpFoundation\Request;
class Validarcontenido
{
private $request, $post, $em;
public function __construct(EntityManager $em)
{
$this->request = Request::createFromGlobals();
$this->post = $this->request->request->all();
// gets doctrine instance
$this->em = $em;
}
}
Heres a working example (that provides the container): https://codedump.io/share/tpxgpEMJnaiW
Ok, the problem was that when i create the service instance in the controller i used this:
$my_class = new My_class();
And now i know that i have to use this:
$my_class = $this->get('service_name');
Thank you so much!

MongoDB & MySQL relationships in jenssegers/laravel-mongodb

Let's begin with some plain code. I have two following models.
First is using MySQL:
class Phrase extends \Eloquent {
public function positions()
{
return $this->hasMany('Position');
}
public function getIdAttribute($id)
{
return (int) $id;
}
}
and second is using MongoDB:
use Jenssegers\Mongodb\Model as Eloquent;
class Position extends Eloquent {
protected $collection = 'positions';
protected $connection = 'mongodb';
public function phrase()
{
return $this->belongsTo('Phrase');
}
}
In my controller I want to get phrase positions:
Phrase::find(1)->positions
which is generating query
positions.find({"positions.phrase_id":1}, [])
instead of
positions.find({"phrase_id":1}, [])
How I can fix it? The problem is inside HasMany method (http://laravel.com/api/source-class-Illuminate.Database.Eloquent.Model.html#_hasMany).
I managed to get the functionality by creating my own function inside the model
class Phrase extends \Eloquent {
public function positions()
{
return Position::where('phrase_id', '=', (int) $this->id)->get();
return $this->hasMany('Position');
}
}
$positions = Phrase::find(1)->positions();
Anyway, this solution is not a great replacement, because it's breaking convention. Third programmers may not know how to use this relationship.
use this trait in both models and u can use basic relationships
use Jenssegers\Mongodb\Eloquent\HybridRelations;
class User extends Model
{
protected $connection = "mysql" ;
use HybridRelations ;
}
class Orders extends Model
{
protected $connection = "mongo" ;
use HybridRelations ;
}

Referencing variable set by application in models (a good idea?)

i am using zend framework 1.10 with doctrine 2. i wonder if in my (doctrine) model class, isit a good idea to reference a variable set by my application (bootstrap.php, variable stored in Zend_Registry, i think its something like a global variable)
what i want to access is the doctrine entityManager. also i want the id of the logged in user
I am building a project with similar setup (ZF 1.10 + Doctrine2) and I've used dependency injection to deal with this situation, much like takeshin said. Here goes full project repository URL: https://bitbucket.org/phpfour/zf-doctrine2. Below are some code excerpts.
Here's my controller:
<?php
require_once APPLICATION_PATH . "/models/PostManager.php";
class IndexController extends Zend_Controller_Action
{
private $_em;
public function init()
{
$this->_em = $this->getInvokeArg('bootstrap')->getResource('doctrine');
}
public function indexAction()
{
$pm = new PostManager($this->_em);
$this->view->posts = $pm->getPublicPosts();
}
My entity manager (or service class):
<?php
class PostManager
{
protected $_em;
public function __construct(Doctrine\ORM\EntityManager $em)
{
$this->_em = $em;
}
public function getPublicPosts()
{
$query = $this->_em->createQuery('SELECT p FROM Entities\Post p WHERE p.visible = true');
$posts = $query->getResult();
return $posts;
}
Hope this helps!
you should simply use Zend_Auth for the logged-in-userId problem, then could do something like the following in your model
class Model extends BaseModel
{
public function something()
{
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$loggedInUserId = $auth->getIdentity()->id;
}
}
}
There is nothing wrong with this approach (unless you are referring to singletons). Use dependency injection where possible.
However I'd create a service (or two) for this.
class Modulename_Services_Servicename
{
public function getCurrentUser() { ... }
public function getCurrentUserModel() { ... }
public function isLogged() { ... }
public function authenticate() { ... }
public function getSomeData()
{
$user = $this->getCurrentUser()
$model = new YourModel($user);
$query = ....;
$result = $query->execute();
return $result;
}
public function getSomeMoreData($usermodel) { ... }
}