Laravel orderByRaw with postgres - laravel

I working with Laravel and postgres. I have a code:
$users->orderBy(\DB::raw("FIELD(status, $orderedStatuses)"));
After running, I get error: Undefined function FIELD() in postgres. How I can resolve this issue?

The problem is that the second onwards parameters to FIELD should be valid MySQL literals. In this case, assuming your status values are text, these parameters need to be CSV valid strings. You could use implode here as follows:
$items = "'" . implode("', '", $orderedStatuses) . "'";
// ...
$users->orderBy(\DB::raw("FIELD(status, $items)"));
Note that this approach may expose you to SQL injection. Assuming the list of fields to be used with FIELD are relatively small, it would be safer to use just ORDER BY using a CASE expression.
Edit:
As you are using Postgres, and not MySQL or MariaDB, there is no FIELD function available to you, even with raw SQL. So, you should instead order by a CASE expression, something like this:
ORDER BY CASE status WHEN 'start' THEN 1 WHEN 'middle' THEN 2 ELSE 3 END
Updated Laravel code:
$orderBy = "CASE status WHEN 'start' THEN 1 WHEN 'middle' THEN 2 ELSE 3 END";
$users->orderBy(\DB::raw($orderBy));

Related

Laravel - WhereExists returning "Invalid parameter number: parameter was not defined"

I'm trying to use whereExists() on an existing Eloquent query builder (called $trips):
$trips = $trips->whereExists(function ($query) use ($filterValue) {
$query->from(DB::raw("jsonb_array_elements(passengers->'adults'->'persons') as p(person)"))
->whereRaw("p.person->>'name' LIKE '?%'", $filterValue);
});
The query I'm trying to create in raw postgres format is the following (this query works fine using pgAdmin):
SELECT *
from trips
WHERE exists (select *
from jsonb_array_elements(passengers -> 'adults' -> 'persons') as p(person)
where p.person ->> 'name' LIKE 'Prof%');
And I'm receiving this error:
Invalid parameter number: parameter was not defined
I think the problem is small, but I can't see it myself.
The parameter definition in your whereRaw() statement is not quite correct. Parameterized queries are not just string replacements. Your query as written doesn't have a parameter in it, it has a string literal of '?%'. You need to change this to a query parameter, and append the % wildcard to the string you pass in.
Try this:
->whereRaw("p.person->>'name' LIKE ?", $filterValue.'%')

laravel multiple read data

Iam learning laravel.I don't understand how to read multiple data in laravel.
In my Data-table , my value is 1,2,3
my column name is hobby & value is 1,2 . 1 & 2 are related other table, where i stored my hobby name .
suppose ,
id || name
1 || gardening
2 || playing
I want to display
gardening,playing
My controller's Code :-
$interests = DB::table('tbl_interests') ->join('tbl_interest_masters','tbl_interest_masters.interest','=','tbl_interests.id')
->select()
->get();
return view('profile')
->with('interest',$interests);
Don't understand how display data in my view ?
is my code right for read multiple data !!
Note that, i already learn how to read single data with relationship in Laravel.
just remove the select() method from the chain.
$interests = DB::table('tbl_interests')
->join('tbl_interest_masters','tbl_interest_masters.interest','=','tbl_interests.id')
->first();
return view('profile')->with('interest',$interests);
I don't fully understand your question, do you want to return multiple variables?
If so, try this:
return view('YOUR_VIEW', compact('VARIABLE1', 'VARIABLE2'));
If you are using blade, you can use this to display the returned variables:
{{$VARIABLE1}}
Loop through an array:
#foreach($interests as $interest)
{{$interest->name}}
#endforeach

Laravel Query Builder: whereExists translates condition clause to question mark

If I have the following query built using the Query Builder:
$q = DB::table('Products')->whereExist(function ($q)
{
$q->select(DB::raw(1))
->from('tags_products')
->where('products.PorductId', '=', 'tags_products.ProductID');
});
The translated SQL using $q->toSql(); that is:
select * from `Products` where `exist` = (select 1 from `tags_products` where `products`.`ProductID` = ?)
Apparently, the Query Builder translates tags_products.ProductID to ?.
Why does it become "?" ?
As #Jared Eitnier very well pointed out, Laravel uses PDO to bind the parameters you pass to the Query Builder methods. However, because when you use where the third parameter represents the value, Laravel will not treat it as a column unless you explicitly tell it to, otherwise it will treat 'tags_products.ProductID' as a regular string value. So you have two options here:
1. Use DB::raw() to let the Query Builder know that the value is not a string that requires escaping:
->where('products.PorductId', '=', DB::raw('tags_products.ProductID'));
2. Use whereRaw() which will allow you to write a raw SQL statement:
->whereRaw('products.PorductId = tags_products.ProductID');
These are mysql prepared statements.
See What is the question mark's significance in MySQL at "WHERE column = ?"?
Laravel uses mysql's PDO.

Wierd bug in CodeIgniter when I queried two tables with relationship... o_O

So I got a wierd bug (or maybe I'm just stupid), when I runs an active record query. Take a look at this:
$results = $this->db->
select('cd.casino_name, cd.casino_opened, cd.casino_latitude, cd.casino_longitude')->
from('casino_data as cd, casino_cities as cc')->
where('cd.city_id',$city_id)->
where('cd.city_id=cc.city_id')->
get()->result_array();
Then I got that:
Error Number: 1054
Unknown column 'cd.city_id=cc.city_id' in 'where clause'
SELECT `cd`.`casino_name`, `cd`.`casino_opened`, `cd`.`casino_latitude`, `cd`.`casino_longitude`
FROM (`m_casino_data` as cd, `m_casino_cities` as cc)
WHERE `cd`.`city_id` = 1
AND `cd`.`city_id=cc`.`city_id`
Filename: httpdocs/_dev/libraries/Test.php
Line Number: 649
Sh*t happened... Or in v2.0 CI has been changed something in the DB class?
help plz...thx
The problem is there with the where clause
$results = $this->db->
select('cd.casino_name, cd.casino_opened, cd.casino_latitude, cd.casino_longitude')->
from('casino_data as cd, casino_cities as cc')->
where('cd.city_id',$city_id)->
where('cd.city_id','cc.city_id')->//this would produce WHERE cd.city_id = cc.city_id
get()->result_array();
CodeIgniter's AR protecting works poorly sometimes. In this cases I think you should use an optional parameter FALSE to avoid autoprotecting. But not all function accepts this parameter - but where yes!
$this->db->where() accepts an optional third parameter. If you set it to FALSE, CodeIgniter will not try to protect your field or table names with backticks.
See documentation (you can find near 4. Custom string).

ActiveRecord search returns 'Syntax error or access violation' error

In my Yii application, I have a model that represents siteconfig table and have four columns:
integer config_id,
string key,
string value,
string update_time.
I created a model using Gii (to ensure that I will not make any mistakes). I don't publish entire code here, cause this is 100% unmodified by me, standard model code generated by Gii. Since my problem is related to search, I only publish important part of generated code (the search() method):
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->compare('config_id',$this->config_id);
$criteria->compare('key',$this->key,true);
$criteria->compare('value',$this->value,true);
$criteria->compare('update_time',$this->update_time,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
I'm trying to use generated model in normal Yii ActiveRecord search like that:
$etona = new SiteConfigurationRecord();
$crit = new CDbCriteria();
$crit->select = "value";
$crit->condition = "key=:key";
$crit->params = array(":key"=>"sitename");
$etona = $etona->find($crit);
But, instead of getting expected search results, a strange (for me) error occurs:
CDbCommand failed to execute the SQL statement: SQLSTATE[42000]:
Syntax error or access violation: 1064 You have an error in your SQL
syntax; check the manual that corresponds to your MySQL server version
for the right syntax to use near 'key='sitename' LIMIT 1' at line 1.
The SQL statement executed was: SELECT value FROM siteconfig t
WHERE key=:key LIMIT 1
Where did I go wrong?
You used key for column name, which is a reserved word in MySQL. Yii uses table alias in queries, but does not take any special care in case of reserverd word used as columns names. So, you have to take care of this by yourself.
For example:
$etona = new SiteConfigurationRecord();
$crit = new CDbCriteria();
$crit->select = "value";
$crit->condition = "t.key=:key"; // 't' is default alias
$crit->params = array(":key"=>"sitename");
$etona = $etona->find($crit);
This should solve your problem.
As #Dmitry explained, SQL doesn't allow you to use the column name key. The Yii call in the code in your answer works because Yii performs parameter binding automatically, using names other than reserved words for the parameters. And it also uses fully-qualified column names (prefixes all column name references with <tablename>., regardless of what invalid column name (reserved words) you pass the findByAttributes method.
now it works.. ^^
i just use this code...
$etona = SiteConfigurationRecord::model()->findByAttributes(array('key'=>'sitename'));
maybe i need to study activerecord more somehow...
but still i don't know why the code above doesn't work

Resources