Safe Haskell | Safe-Inferred |
---|---|
Language | GHC2021 |
Database.Persist.Sql.Lifted.From
Synopsis
- data From a
- from :: ToFrom a a' => a -> SqlQuery a'
- table :: PersistEntity ent => From (SqlExpr (Entity ent))
- data a :& b = a :& b
- on :: ValidOnClause a => a -> (b -> SqlExpr (Value Bool)) -> (a, b -> SqlExpr (Value Bool))
- innerJoin :: (ToFrom a a', ToFrom b b', HasOnClause rhs (a' :& b'), rhs ~ (b, (a' :& b') -> SqlExpr (Value Bool))) => a -> rhs -> From (a' :& b')
- innerJoinLateral :: (ToFrom a a', HasOnClause rhs (a' :& b), SqlSelect b r, ToAlias b, ToAliasReference b, rhs ~ (a' -> SqlQuery b, (a' :& b) -> SqlExpr (Value Bool))) => a -> rhs -> From (a' :& b)
- leftJoin :: (ToFrom a a', ToFrom b b', ToMaybe b', HasOnClause rhs (a' :& ToMaybeT b'), rhs ~ (b, (a' :& ToMaybeT b') -> SqlExpr (Value Bool))) => a -> rhs -> From (a' :& ToMaybeT b')
- leftJoinLateral :: (ToFrom a a', SqlSelect b r, HasOnClause rhs (a' :& ToMaybeT b), ToAlias b, ToAliasReference b, ToMaybe b, rhs ~ (a' -> SqlQuery b, (a' :& ToMaybeT b) -> SqlExpr (Value Bool))) => a -> rhs -> From (a' :& ToMaybeT b)
- rightJoin :: (ToFrom a a', ToFrom b b', ToMaybe a', HasOnClause rhs (ToMaybeT a' :& b'), rhs ~ (b, (ToMaybeT a' :& b') -> SqlExpr (Value Bool))) => a -> rhs -> From (ToMaybeT a' :& b')
- fullOuterJoin :: (ToFrom a a', ToFrom b b', ToMaybe a', ToMaybe b', HasOnClause rhs (ToMaybeT a' :& ToMaybeT b'), rhs ~ (b, (ToMaybeT a' :& ToMaybeT b') -> SqlExpr (Value Bool))) => a -> rhs -> From (ToMaybeT a' :& ToMaybeT b')
- crossJoin :: (ToFrom a a', ToFrom b b') => a -> b -> From (a' :& b')
- crossJoinLateral :: (ToFrom a a', SqlSelect b r, ToAlias b, ToAliasReference b) => a -> (a' -> SqlQuery b) -> From (a' :& b)
Type
Data type defining the From language. This should not constructed directly in application code.
A From
is a SqlQuery which returns a reference to the result of calling from
and a function that produces a portion of a FROM clause. This gets passed to
the FromRaw FromClause constructor directly when converting
from a From
to a SqlQuery
using from
Since: esqueleto-3.5.0.0
Table
from :: ToFrom a a' => a -> SqlQuery a' #
FROM
clause, used to bring entities into scope.
Internally, this function uses the From
datatype.
Unlike the old from
, this does not
take a function as a parameter, but rather a value that
represents a JOIN
tree constructed out of instances of From
.
This implementation eliminates certain
types of runtime errors by preventing the construction of
invalid SQL (e.g. illegal nested-from
).
table :: PersistEntity ent => From (SqlExpr (Entity ent)) #
Bring a PersistEntity into scope from a table
select $ from $ table @People
Since: esqueleto-3.5.0.0
Joins
A left-precedence pair. Pronounced "and". Used to represent expressions that have been joined together.
The precedence behavior can be demonstrated by:
a :& b :& c == ((a :& b) :& c)
See the examples at the beginning of this module to see how this
operator is used in JOIN
operations.
Constructors
a :& b infixl 2 |
Instances
on :: ValidOnClause a => a -> (b -> SqlExpr (Value Bool)) -> (a, b -> SqlExpr (Value Bool)) infix 9 #
An ON
clause that describes how two tables are related. This should be
used as an infix operator after a JOIN
. For example,
select $ from $ table @Person `innerJoin` table @BlogPost `on` (\(p :& bP) -> p ^. PersonId ==. bP ^. BlogPostAuthorId)
innerJoin :: (ToFrom a a', ToFrom b b', HasOnClause rhs (a' :& b'), rhs ~ (b, (a' :& b') -> SqlExpr (Value Bool))) => a -> rhs -> From (a' :& b') infixl 2 #
INNER JOIN
Used as an infix operator `innerJoin`
select $ from $ table @Person `innerJoin` table @BlogPost `on` (\(p :& bp) -> p ^. PersonId ==. bp ^. BlogPostAuthorId)
Since: esqueleto-3.5.0.0
innerJoinLateral :: (ToFrom a a', HasOnClause rhs (a' :& b), SqlSelect b r, ToAlias b, ToAliasReference b, rhs ~ (a' -> SqlQuery b, (a' :& b) -> SqlExpr (Value Bool))) => a -> rhs -> From (a' :& b) infixl 2 #
INNER JOIN LATERAL
A Lateral subquery join allows the joined query to reference entities from the left hand side of the join. Discards rows that don't match the on clause
Used as an infix operator `innerJoinLateral`
See example 6
Since: esqueleto-3.5.0.0
leftJoin :: (ToFrom a a', ToFrom b b', ToMaybe b', HasOnClause rhs (a' :& ToMaybeT b'), rhs ~ (b, (a' :& ToMaybeT b') -> SqlExpr (Value Bool))) => a -> rhs -> From (a' :& ToMaybeT b') infixl 2 #
LEFT OUTER JOIN
Join where the right side may not exist. If the on clause fails then the right side will be NULL'ed Because of this the right side needs to be handled as a Maybe
Used as an infix operator `leftJoin`
select $ from $ table @Person `leftJoin` table @BlogPost `on` (\(p :& bp) -> just (p ^. PersonId) ==. bp ?. BlogPostAuthorId)
Since: esqueleto-3.5.0.0
leftJoinLateral :: (ToFrom a a', SqlSelect b r, HasOnClause rhs (a' :& ToMaybeT b), ToAlias b, ToAliasReference b, ToMaybe b, rhs ~ (a' -> SqlQuery b, (a' :& ToMaybeT b) -> SqlExpr (Value Bool))) => a -> rhs -> From (a' :& ToMaybeT b) infixl 2 #
LEFT OUTER JOIN LATERAL
Lateral join where the right side may not exist. In the case that the query returns nothing or the on clause fails the right side of the join will be NULL'ed Because of this the right side needs to be handled as a Maybe
Used as an infix operator `leftJoinLateral`
See example 6 for how to use LATERAL
Since: esqueleto-3.5.0.0
rightJoin :: (ToFrom a a', ToFrom b b', ToMaybe a', HasOnClause rhs (ToMaybeT a' :& b'), rhs ~ (b, (ToMaybeT a' :& b') -> SqlExpr (Value Bool))) => a -> rhs -> From (ToMaybeT a' :& b') infixl 2 #
RIGHT OUTER JOIN
Join where the left side may not exist. If the on clause fails then the left side will be NULL'ed Because of this the left side needs to be handled as a Maybe
Used as an infix operator `rightJoin`
select $ from $ table @Person `rightJoin` table @BlogPost `on` (\(p :& bp) -> p ?. PersonId ==. bp ^. BlogPostAuthorId)
Since: esqueleto-3.5.0.0
fullOuterJoin :: (ToFrom a a', ToFrom b b', ToMaybe a', ToMaybe b', HasOnClause rhs (ToMaybeT a' :& ToMaybeT b'), rhs ~ (b, (ToMaybeT a' :& ToMaybeT b') -> SqlExpr (Value Bool))) => a -> rhs -> From (ToMaybeT a' :& ToMaybeT b') infixl 2 #
FULL OUTER JOIN
Join where both sides of the join may not exist. Because of this the result needs to be handled as a Maybe
Used as an infix operator `fullOuterJoin`
select $ from $ table @Person `fullOuterJoin` table @BlogPost `on` (\(p :& bp) -> p ?. PersonId ==. bp ?. BlogPostAuthorId)
Since: esqueleto-3.5.0.0
crossJoin :: (ToFrom a a', ToFrom b b') => a -> b -> From (a' :& b') infixl 2 #
CROSS JOIN
Used as an infix `crossJoin`
select $ do from $ table @Person `crossJoin` table @BlogPost
Since: esqueleto-3.5.0.0
crossJoinLateral :: (ToFrom a a', SqlSelect b r, ToAlias b, ToAliasReference b) => a -> (a' -> SqlQuery b) -> From (a' :& b) infixl 2 #
CROSS JOIN LATERAL
A Lateral subquery join allows the joined query to reference entities from the left hand side of the join.
Used as an infix operator `crossJoinLateral`
See example 6
Since: esqueleto-3.5.0.0