Breezejs:在相关表格中的字段上执行搜索

时间:2013-04-29 09:16:23

标签: odata breeze

我已经按照教程/视频展示了如何对来自Microsoft后端运行的northwind数据库上的两个实体的数据进行实时搜索。

我必须开发一个具有php / mysql后端的应用程序,以便掌握php生成器类来执行此操作。我已连接到Wordpress DB,它似乎都运行良好。

然而,我的问题是当我尝试在相关的表上执行搜索时。我有一个网格显示作者的displayName(来自用户实体),post titledate(来自帖子)。

<input type="text" data-ng-model="searchText"/> {{searchText}}
<table class="table table-hover">
    <thead>
    <tr>
        <th>Author </th>
        <th>Date</th>
        <th>Title</th>
    </tr>
    </thead>
    <tr ng-repeat="post in posts">
        <td>{{post.user.displayName}}</td>
        <td>{{post.date}}</td>
        <td>{{post.title}}</td>
    </tr>
</table>

在控制器中(实际上是datacontext.js)我有以下内容从服务器获取数据:

    if (searchText && (searchText = searchText.trim())) {
        log("searching for " + searchText);
        var pred = breeze.Predicate
            .create('title', 'contains', searchText);               
        query = query.where(pred);

    } else {
        console.log("getting all");
    }

    return manager.executeQuery(query).then(success);

我的问题是正确引用Predicate中的字段。当我运行代码搜索下面的帖子标题实体时,它可以正常工作。

var pred = breeze.Predicate
            .create('title', 'contains', searchText);

一旦我将其更改为以下内容,它就会停止工作。控制台中也没有错误。

 var pred = breeze.Predicate
            .create('title', 'contains', searchText)
            .or('displayname', 'contains', searchText);

我尝试过'displayName'的几种变体,例如'displayname','posts.user.displayname','user.displayname'以及camelCase中的所有变种。

有人可以告诉我哪里出错了吗?

2 个答案:

答案 0 :(得分:1)

breeze网页中有一个示例,显示如何查询相关属性。

// Products in a Category whose name starts with 'S'
var query1 = EntityQuery.from("Products")
    .where("Category.CategoryName", "startswith", "S")

// Orders sold to a Customer located in California
var query2 = EntityQuery.from("Orders")
    .where("Customer.Region", "==", "CA");

所以,我认为在你的代码中,错误可以在下一行:

var pred = breeze.Predicate
            .create('title', 'contains', searchText)
            .or('displayname', 'contains', searchText);

应该是:

var pred = breeze.Predicate
            .create('title', 'contains', searchText)
            .or('user.displayname', 'contains', searchText);

答案 1 :(得分:0)

事实证明,jvrdelafuente是正确的...使用breeze引用oData中相关表的正确格式(在Wordpress示例中)user.displayName。我遇到的问题是php(https://github.com/MSOpenTech/odataphpprod/)的odata生成器有一个错误并返回错误。令人遗憾的是,这个项目已被放弃,因为我相信很多人都可以从中受益。它尚不支持创建,更新或删除。

感谢jvrdelafuente的帮助。