Take a look at your executed sql.
Condition arrays are always escaped
When a condition is defined as an array, it's assumed by CakePHP that the key is "safe" and the value is user input, array values are always escaped. What that means here is that this code:
public $hasOne = array(
'ArticleUser',
'FavoriteArticle' => array(
'conditions' => array(
'FavoriteArticle.user_id' => 'ArticleUser.user_id' # <-
),
'dependent' => true
)
);
With a find call like this:
$stuff = $articles->find('all', [
'contain' => [
'ArticleUser',
'FavoriteArticle'
]
]);
Would generate sql equivalent to:
SELECT
*
FROM
articles
LEFT JOIN
article_user ON (
favorite_articles.article_user_id = article_user.id
)
LEFT JOIN
favorite_articles ON (
favorite_articles.articles_id = articles.id AND
favorite_articles.user_id = 'ArticleUser.user_id' # <-
)
Note that the join condition is comparing user_id
to a string
How to compare two field values
To compare two field values, use an sql fragment:
public $hasOne = array(
'ArticleUser',
'FavoriteArticle' => array(
'conditions' => array(
'FavoriteArticle.user_id = ArticleUser.user_id'
^ ^ no quotes
),
'dependent' => true
)
);
Which would generate sql equivalent to:
SELECT
*
FROM
articles
LEFT JOIN
article_user ON (
favorite_articles.article_user_id = article_user.id
)
LEFT JOIN
favorite_articles ON (
favorite_articles.articles_id = articles.id AND
favorite_articles.user_id = articles_users.user_id # <-
)