Your first query would actually have to be written like this:
$contact = Contact::where('user_id', Auth::user()->id)->where('id', $id)->first();
To solve your problem, you can use query scopes, like this:
class Contact extends Eloquent {
public function scopeGetById($query, $id)
{
return $query->where('user_id', Auth::user()->id)->where('id', $id);
}
}
You can then use it like this:
$contact = Contact::getById($id)->first();
Laravel 4.2 also introduced global scopes in case you always need to check for the currently logged in user. This feature is still undocumented, but you can have a look at the soft deleting trait and the corresponding scope to see how it's done.
another possibility
<?php
abstract class AbstractModel extends \Illuminate\Database\Eloquent\Model
{
public function newQuery()
{
$builder = $this->newEloquentBuilder(
$this->newBaseQueryBuilder()
);
$builder->setModel($this)->with($this->with);
if ($user = \Illuminate\Support\Facades\Auth::user()) {
$builder->where('user_id', '=', $user->id);
}
return $this->applyGlobalScopes($builder);
}
}
and then use it as
<?php
class MyModel extends AbstractModel {}
shabushabu said:
Your first query would actually have to be written like this:
$contact = Contact::where('user_id', Auth::user()->id)->where('id', $id)->first();
This is because $contact = Contact::where('user_id', Auth::user()->id)->find($id); will search in ALL contacts, not only in the contacts you filtered with user_id.
Its the same as $contact = Contact::where('user_id', Auth::user()->id)->first()->first(); This will return the first contact from DB, ignoring the where part and the 1st first().
Have been thinking about it, and still find this a very weird logic. Is it just me, or others also have this feeling?
I have asked it before, but only received an advantage of it. Link
Sign in to participate in this thread!
The Laravel portal for problem solving, knowledge sharing and community building.
The community