使用Phalcon ORM在相关表中查找数据

时间:2017-12-25 21:14:38

标签: php mysql pdo orm phalcon

我可以使用像这样的Phalcon ORM在相关表格上找到数据吗?

assembly: ExportRenderer(typeof(StreetView), typeof(StreetViewRenderer))]
namespace Yournamespace.iOS.Renderer
{
    public class StreetViewRenderer : ViewRenderer<StreetView, PanoramaView>
    {
        PanoramaView panoramaView;

        protected override void OnElementChanged(ElementChangedEventArgs<StreetView> e)
        {
            base.OnElementChanged(e);

            if (Control == null)
            {
                CGRect rect = new CGRect(0, 0, App.ScreenWidth, App.ScreenHeight);
                panoramaView = new PanoramaView(rect);
                SetNativeControl(panoramaView);

                if (SharedSystem.Current.CurrentVehicle.PlateNumber == null)
                {
                    SetCoordinate(40.968845, 29.065849);    
                }
                else
                    SetCoordinate(SharedSystem.Current.CurrentVehicle.DeviceLatitude.Value, SharedSystem.Current.CurrentVehicle.DeviceLongitude.Value);    



            }
            if (e.OldElement != null)
            {
                // Unsubscribe
                panoramaView.DidMoveToPanoramaNearCoordinate -= PanoramaView_DidMoveToPanoramaNearCoordinate;

                MessagingCenter.Unsubscribe<Vehicle>(this, "SelectedPin");
            }
            if (e.NewElement != null)
            {
                // Subscribes
                MessagingCenter.Subscribe<Vehicle>(this, "SelectedPin", (sender) =>
                {
                    if(SharedSystem.Current.CurrentVehicle.PlateNumber == sender.PlateNumber)
                        SetCoordinate(sender.DeviceLatitude.Value,sender.DeviceLongitude.Value);
                });

                MessagingCenter.Subscribe<Vehicle>(this, "ScrollToVehicle", (sender) =>
                {
                    if (SharedSystem.Current.CurrentVehicle.PlateNumber == sender.PlateNumber)
                        SetCoordinate(sender.DeviceLatitude.Value, sender.DeviceLongitude.Value);
                });
                panoramaView.DidMoveToPanoramaNearCoordinate += PanoramaView_DidMoveToPanoramaNearCoordinate;
            }
        }

        public void SetCoordinate(double latitude, double longitude)
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                CLLocationCoordinate2D location = new CLLocationCoordinate2D(latitude, longitude);
                panoramaView.MoveNearCoordinate(location);

            });


        }

        void PanoramaView_DidMoveToPanoramaNearCoordinate(object sender, GMSPanoramaDidMoveToPanoramaNearCoordinateEventArgs e)
        {

        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                Control.Dispose();
            }
            base.Dispose(disposing);
        }
    }

以前我在Phalcon ORM中使用过它

SELECT * 
FROM user 
LEFT JOIN media_manager ON media_manager.user_id = user.id
WHERE media_manager.upload_date > '2017-01-01';

但我不知道如何在MediaManager中找到像PDO一样的数据。

1 个答案:

答案 0 :(得分:1)

我不认为Phalcon ORM足够强大,允许您在find的条件部分指定此类内容,除非您通过添加leftJoin来构建此类内容一路上所以条件可以参考它。你可以对模型的initialize中发生的事情以及调整Phalcon以满足你的需求有所了解,但是ORM会在PHP中循环,而不是用查询来做。 ORM不是SQL的替代品,我强烈建议在SQL中执行此类操作,而不是在PHP中循环它。

我个人会通过向你的模型添加一个新的静态方法来解决这个问题,你可以通过允许leftJoins以一种特殊的方式“找到”。对我来说,这似乎是一个很好的解决方案:How to run RAW SQL query in PhalconPHP 然后你只需调整那里的查询并放置LEFT JOIN。

换句话说:

<?php

use Phalcon\Mvc\Model\Resultset\Simple as Resultset;

class User extends Phalcon\Mvc\Model
{
    public static function advancedFind($conditions = 1, $params = null)
    {
        $sql = "SELECT u.*,m.* FROM user u LEFT JOIN media_manager m ON m.user_id = u.id
                WHERE $conditions";

        // Base model
        $user = new User();

        // Execute the query
        return new Resultset(null, $user, $user->getReadConnection()->query($sql, $params));
    }
}  

然后你会做类似的事情:

$data = User::advancedFind("m.upload_date > '2017-01-01'");