Following on from the previous tutorial, we'll look at more advanced filtering options and show how you can filter with multiple rules.
In the last tutorial, we looked at how to filter your results so that only items from webapp_1 were returned. We also challenged you to see if you could adjust the query so that it returned all WebApp items.
This time, we'll look at:
Some fields in models are defined in the GraphQL schema, like model_schema_name, this often means they have their own filter option in the documentation. Siteglide fields, and your own custom fields, are very likely to be custom "properties" which are not directly defined by the schema. If you're not sure, check the schema for the field you're looking for. If you can't find it, it's a property.
For example, release_date is not a custom field in the Siteglide Admin, but it's not in the list of available fields to filter by in the schema- so we'll need to use properties.
A brief note on name . You'll see the term name available in the schema- but this is a deprecated way of referring to the model_schema_name e.g. webapp_1. To fetch the name of the item in the Siteglide Admin, you'll need properties.name.
In our next example query, we'll demonstrate this. Let's search for items with a properties.name that contains the string "music".
Explorer: Adding a single filter to properties can be done with the Explorer wizard. However, if you want to be able to filter by an array of different properties, Explorer has no support for this yet, but it is possible by writing in the query manually.
In the examples so far, we've only filtered by strings- or in other words, groups of letters or characters. Next we'll look at some other data types:
A good example of a Boolean property in Siteglide is enabled. This is a property which is stored as either true or false . Let's find all the items which are currently enabled: Code:
When filtering by integers (which also includes Siteglide's release_date and expiry_date fields, as these are stored as Epoch Timestamps) you've got a choice whether to filter by values or a range of values.
Most often, you'll want to use more complex comparisons for integers. We'll look at how to do this next- at the same time, we'll take a look at how Siteglide normally formats dates. The dates are stored in Epoch Timestamp format, which is an integer storing the number of seconds which have elapsed since the Epoch. You can convert a date of your choice to this format here: https://www.epochconverter.com/
In this example, I'll use the time at the current time of writing: 1582108820. Let's query for all items which have already been released. In other words, the value stored in release_date should be less than, or equal to, the current timestamp. When you're thinking about dates, you can think of "less than" as meaning "before" and "greater than" as meaning "after". So here we're asking for "items with a release_date before now".
An array is a list of data. One good example in Siteglide is category_array, which stores a list of unique IDs that refer to categories. We can now write a query to find items in a particular category. Code:
Explorer: Only partial support is currently available in Explorer for this. It's not so good at handling arrays. So you can select the property in Explorer, but you'll need to add the value manually into your query. So firstly, implement with the wizard:
Secondly, change the value manually in the code from: value_in: "158198"...to: value_in: ["158198"]
For all the filters you've learned in this Article and the previous Article, you can apply more than one at once.
Explorer: Unfortunately, arrays are not currently supported in Explorer, so you'll have to enter this section of the query manually for now.
You can also find items where a property does, or doesn't exist. In this example, we're looking for WebApps where a meta_title was not added. Code:
What if you are looking to filter models so you can find models which fit either one rule or another- but don't need to match both rules?
Here's an example from the pOS team of how you can use the "or" option when filtering. In this example we get models where either a "webapp_field_1_1" exists OR a field "parent" exists.
You can add multiple filter properties inside each object, but these will be compared with AND logic. So, to filter models by those which have both ( "webapp_field_1_1" AND "webapp_field_1_2") OR "parent", you would do the following:
See if you can write one query which uses multiple filters. Try and return models which meet these criteria:
Hint: This search is so specific, that by default on Starter Site it will return no results. Try creating an eCommerce Product which meets these criteria before you start- that way, you'll know when you've succeeded.
It's unusual to run this many filters at once. Most of the time in a real use case, you'd have less to write than this! However, putting together everything you've done so far will be good practice.
We'll look at the answer to this Challenge in the next Article.
We'll look at a possible solution to our latest challenge question.
After that, we'll look at how to run a query on a real Siteglide Site for the first time- and look at what you can do with the results.