symfony2,java开发者的选择(模型)

之前一直搞Java开发,十几年了。所用框架Java开发者都比较熟悉,就是经典的Spring+struts2+Hibernate,也习惯了MVC这种模式下的开发。这两年,公司转型做互联网开发,就改用php了。php下的框架也是多如牛毛,都说好,但我只想找一个和SSH思路差不多的框架,对各种框架也进行过比较,最终选择了Symfony2。

下面就来进行一个比较。


1.M

 SSH中,使用 Hibernate来做模型,通常的做法是创建POJO对象,通过Annotation进行标记(描述实体类与数据表的关系,字段的类型,类与类之间的关系:一对多,一对一,多对多)等。Symfony2呢,使用Doctrine2这个框架,上代码,javaer很容易看明白:


Address.class类

<?php
namespace WxBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="wx_address")
 * @ORM\Entity(repositoryClass="WxBundle\Repository\AddressRepository")
 */
class Address
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;


    // 会员
    /**
     * @ORM\ManyToOne(targetEntity="Member")
     */
    private $member;


    //是否默认

    /**
     * @ORM\Column(type="integer")
     */
    protected $defo;


    //收货人

    /**
     * @ORM\Column(type="string")
     */
    protected $name;


    //手机

    /**
     * @ORM\Column(type="string")
     */
    protected $mobile;


    //电话

    /**
     * @ORM\Column(type="string",nullable=true)
     */
    protected $phone;



    //配送区域

    /**
     * @ORM\Column(type="string",nullable=true)
     */
    protected $area;

    //详细地址

    /**
     * @ORM\Column(type="string")
     */
    protected $address;


    /**
     * @ORM\Column(type="datetime")
     */
    protected $created;


    public function __construct()
    {
        $this->created = new \DateTime();
        $this->defo = 0;

    }


}





Member.class 会员类

<?php
// wf
namespace WxBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="wx_member")
 * @ORM\Entity(repositoryClass="WxBundle\Repository\MemberRepository")
 */
class Member
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=100,nullable=true)
     */
    protected $name;

    // 微信号
    /**
     * @ORM\Column(type="string", length=100,nullable=true)
     */
    protected $openid;
    protected $verifyCode;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $mobile;


    //推荐者手机
    /**
     * @ORM\Column(type="string", length=100,nullable=true)
     */
    protected $recommenderMobile;


    //微信头像
    /**
     * @ORM\Column(type="string", length=250,nullable=true)
     */
    protected $headimgurl;


    //微信呢称
    /**
     * @ORM\Column(type="string", length=100,nullable=true)
     */
    protected $nickname;




    /**
     * @ORM\Column(type="string",nullable=true)
     */
    protected $memo;


    /**
     * @ORM\Column(type="string",nullable=true)
     */
    protected $password;


    /**
     * @ORM\Column(type="string",nullable=true)
     */
    protected $mail;


    /**
     * @ORM\Column(type="string",nullable=true)
     */
    protected $idNumber;


    // 消费金额
    /**
     * @ORM\Column(type="float",nullable=true)
     */
    protected $amount;


    // 积分
    /**
     * @ORM\Column(type="float",nullable=true)
     */
    protected $credit;


    // 米粒
    /**
     * @ORM\Column(type="float",nullable=true)
     */
    protected $coin;


    // autoLogin
    /**
     * @ORM\Column(type="integer",nullable=true)
     */
    protected $autoLogin;

    // 所属等级
    /**
     * @ORM\ManyToOne(targetEntity="MemberLevel")
     */
    private $level;



    /**
     * @ORM\Column(type="datetime")
     */
    protected $created;

    public function  __construct()
    {
        $this->created=new \DateTime();
        $this->credit = 0;
        $this->coin = 0;
        $this->amount = 0;

    }






}

一个会员可能有多个地址,地址和会员是多对一的关系。熟悉Hibernate的朋友,是不是找到了hibernate的感觉。
repositoryClass="WxBundle\Repository\MemberRepository
这个是什么呢,symfony2会在相应的命名空间(相当于Java中的包)中生成这样一个类。默认具有find,findOne,findAll方法,基本的增删查改就不用再写代码了。这个类似于Hibernate中的Session,或者经spring封装后的HibernateTemplate。
我们来看复杂一点的查询:


//根据电话号码模糊查询会员
public function getMembersByMobile($mobile)
{
    $em = $this->getEntityManager();
    return $em->createQuery("select p from WxBundle:Member p where p.mobile like '%$mobile%'")->getResult();
}



//查询指定会员的默认地址,涉及到了对象之间的关系,这个写法没有hibernate中简洁,但比直接写SQL,还是简洁多了
public function getDefo($memberId)
{
    $em = $this->getEntityManager();
    $addresses = $em->createQuery("select p from WxBundle:Address p left join p.member m where m.id=$memberId and p.defo=1")->getResult();
    if ($addresses)

        return $addresses[0];

    return null;
}



//保存地址

public function save($address)
{

    $em = $this->getEntityManager();
   $em->persist($address);

    $em->flush();
    return true;

}


这就是symfony2中的模型,是不是和Hibernate很象.....

未完待续,明天继续讲V,如果你喜欢,请留言鼓励,你的点赞,是我坚持下去的动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值