I have a weird problem and can't understand why it happens.
I have a table where row has start = 300 and end = 400.
When I try to filter:
$price = 320;
Price::where('start', '>=', $price)->where('end', '<=', $price)->first()
And I have always an empty result. All columns set to an integer. '$price' is an integer. Why I get an empty result, have no idea...
Your query fails because you're saying get price where the start is greater than or equal to 320 (yours is 300 so fails here) AND where end is less than or equal to 320 (yours is 400 so technically this passes)
but since you are doing an AND query the whole query returns nothing.
Try this
Price::where('start', '>=', $price)->orWhere('end', '<=', $price)->first();
or this
Price::where('start', '<=', $price)->where('end', '>=', $price)->first();
Related
Products::whereIn('category_id', ['223', '15', '20'])
->where('active', 1)
->get();
How can I fix this example so that it finds the exact occurrence of category_id = 223 and 15 and 20 and also necessarily active = 1?
It makes no sense to look for exactly category_id = 15, 20 and 223, it can only be one...
But, if you still want that, your query is nearly there, you can do:
Products::where('category_id', '223')
->where('category_id', '15')
->where('category_id', '20')
->where('active', 1)
->get();
But, again, that should return an empty Collection. whereIn is a simple IN in SQL, that means it is an OR for all the values you want.
Use from this group. Because, maybe you use OR condition in future. Therefore, your condition will not work correctly.
For example
Products::query()->where(function ($query){
$query->where('category_id', '223')
->where('category_id', '15')
->where('category_id', '20');
})->where('active', 1)
->get();
Explain of query above will work like that:
Select * from products where (category_id = 223 and category_id = 15 and category_id = 20) and active = 1
I have 2 queries and I would like to know the elements (date_debut) of the second query which exists in the first query (dateincal). The elements of the second query can appear one or more times in the first query.
once the dates (date debut) (dateincal) have been found i want to be able to then retrieve also the other information for the element found
$feries = Jourferie::Select('dateincal', 'description')
->where('dateincal', '>=', Carbon::now()->startOfMonth())
->where('dateincal', '<=', Carbon::now()->endOfMonth())
->get();
$plannings = Planning::Select('date_debut', 'id', 'agent_id', 'site_id')
->where('id', '!=', 0)
->where('statut', 'provisoire')
->get();
I don't know if that way can help you:
foreach($feries as $ferie){
$myresult = $plannings->contains('date_debut',$ferie->dateincal)
/* do things */
}
$groups = Groups::where("min", '>=', $result->Z)
->where("max", '<=', $result->Z)
->orderBy('min')
->get();
Where $result->Z is 52.850294770880225.
So, I should get row:
4 | 47.01 | 52.99 | 0
Instead empty:
Collection {#631 ▼
#items: []
}
You have your conditions the wrong way round. You're currently saying where min is bigger or equal to the value and max is smaller or equal to the value (which in theory should never happen).
Try:
$groups = Groups::where("min", '<=', $result->Z)
->where("max", '>=', $result->Z)
->orderBy('min')
->get();
Notice I've swapped the >= and <= around.
i have a problem trying to get records from a model based on a related table.
I have two tables one called leads and one called recycle_logs, my app will basically send the same record in the leads table like once a month, and when it does so i'll store a new record in recycle_logs.
The problem is that i need to select all leads with a specific campaign_id value and that have a specific status that is different from invalid, so far so good, now the problem is i need to get them only if they don't have any recycleLogs associated with them OR if the last recycleLog associated with that particular lead is older than 30 days ago for instance.
What i currently have looks somewhat like this.
$leads = $this->leadModel->where(Lead::CAMPAIGN_ID, $this->campaignID)
->where(Lead::DUPLICATED, Lead::DUPLICATED_NO)
->where(Lead::LEAD_STATUS, "!=" ,Lead::LEAD_STATUS_INVALID)
->orderBy(Lead::CREATED_AT, 'desc')
->with(
['leadRecyclingLog' => function($query) {
$query->where(LeadRecyclingLog::CREATED_AT, '<', (new Carbon())->subDays($this->configRecyclingDays))
->orWhere(LeadRecyclingLog::ID, null);
}]
)
->get();
What exactly am i doing wrong? It always selects the same number of records regardless of me adding or removing recycleLogs
I've managed to get it done through a raw SQL query which i'll post below in case it helps anyone, i'd still like to know how to do it in Eloquent/Query Builder.
SELECT * FROM `leads` LEFT JOIN `lead_recycling_logs` ON `leads`.`guid` = `lead_recycling_logs`.`original_lead_guid` WHERE `leads`.`campaign_id` = :campaignID AND `leads`.`duplicated` = 0 AND `leads`.`lead_status` != :invalidStatus AND (`lead_recycling_logs`.`id` IS NULL OR `lead_recycling_logs`.`created_at` < :recyclingDate) ORDER BY `leads`.`created_at` DESC
Try this:
$leads = $this->leadModel->where(Lead::CAMPAIGN_ID, $this->campaignID)
->where(Lead::DUPLICATED, Lead::DUPLICATED_NO)
->where(Lead::LEAD_STATUS, "!=" ,Lead::LEAD_STATUS_INVALID)
->orderBy(Lead::CREATED_AT, 'desc')
->where(function($q) {
$q->whereHas('leadRecyclingLog', function($q) {
$q->where(LeadRecyclingLog::CREATED_AT, '<', (new Carbon())->subDays($this->configRecyclingDays));
})
->orWhereHas('leadRecyclingLog', '<', 1); // Where count of the relationship is smaller than 1
})->get();
I assumed the first part of the query is working well (up until the relationship).
What you're looking for is ->whereHas(relationship), not ->with(relationship). ->with(relationship) will attach the associated results to the original model (the query for the original model will not be affected by ->with()). ->whereHas(relationship) filters the original model by the condition.
Got it to work through #devk 's help
$leads = $this->leadModel->where(Lead::CAMPAIGN_ID, $this->campaignID)
->where(Lead::DUPLICATED, Lead::DUPLICATED_NO)
->where(Lead::LEAD_STATUS, "!=" ,Lead::LEAD_STATUS_INVALID)
->orderBy(Lead::CREATED_AT, 'desc')
->where(function($q) {
$q->whereHas('leadRecyclingLog', function($q) {
$q->where(LeadRecyclingLog::CREATED_AT, '<', (new Carbon())->subDays($this->configRecyclingDays));
})
->doesntHave('leadRecyclingLog', 'or');
})->get();
My app has an option to battle another player.
In order to match a player with another, I created a database field named score in my users table.
My goal is to match user with a another random user who is already SEARCHING for a battle. Both of the users has to be on +-100 score difference.
For example, user with score of 100 can battle players with score of 0-200.
I'm trying to search for all of the available options, but couldn't get how to do this.
Currently, I just output the first one in SEARCHING mode.
$pvp = PvpBattle::where('mode','=','SEARCHING')
->first();
How I can get all PvpBattle objects where the associated player1_id has +- 100 score difference from $this->me->score?
Try This code
WhereHas('users') is the user relation between PvpBattle and user
$minScore = $this->me->score - 100;
$maxScore = $this->me->score + 100;
$pvp = PvpBattle::where('mode','=','SEARCHING')
->WhereHas('users', function ($query) use ($minScore, $maxScore){
$query->Where(function ($subQuery) use ($minScore, $maxScore){
$subQuery->orWhere('score', '<=', $maxScore)
->orWhere('score', '>=', $minScore);
});
})
->first();
First find the score of player one to $scoreA or use $this->me->score
Then
$opp_list=PvpBattle::where('mode','=','SEARCHING')->Where(function($query)
{
$query->where('score', '>=', $scoreA -100)
->orwhere('score', '<=', $scoreA+100);
})
->get();
This gets all the players in mode searching with condition score +-100. first() returns the first result from the table.
How are you going to handle two requests at the same time pointing to the same user?
User A should be not returned as a result.
Add ->where('user_id', '!=', $user_id) to query
Use a join with the users table to filter the result by the score of the related user.
$pvps = PvpBattle::join('users', 'users.id', '=', 'pvpbattle.user_id')
->where('pvpbattle.mode','=','SEARCHING')
->where('users.score', '>=', $this->me->score - 100)
->where('users.score', '<=', $this->me->score + 100)
->get()
;